Poruszone zagadnienia
- Parametry / argumenty metody
- Return
- Pakiety
- Modyfikatory dostępu
- JavaBeans
- Enkapsulacja
- Getter oraz Setter
Zmienne i metody - małe przypomnienie
Jak już sobie wspomieniliśmy w…
… zmienne instancji (pola Klasy) opisują stan Obiektu, a metody zachowanie.
Rozważmy taki przykład:
class Dlugopis{ String kolor; public void napiszTekst(){ System.out.println("Długopis pisze na kolor " + kolor); } public static void main(String [] args){ Dlugopis dlugopis1 = new Dlugopis(); Dlugopis dlugopis2 = new Dlugopis(); dlugopis1.kolor = "niebieski" dlugopis2.kolor= "czarny" dlugopis1.napiszTekst(); // output: Długopis pisze na kolor niebieski dlugopis2.napiszTekst(); // output: Długopis pisze na kolor czarny }
W Klasie Dlugopis posiadamy zmienną instancji String kolor oraz metodę void napiszTekst();
Tworzymy dwa Obiekty Klasy Dlugopis (dlugopis1 oraz dlugopis2 ). Mimo, że każdy z tych Obiektów to niezależny twór o swoim unikalnym kolorze, to możemy na nim wywołać tą samą metodę napiszTekst().
Parametry / argumenty metody
Przejdźmy od razu do definicji:
- Parametr metody
Parametrami metody są zmienne używane do przechwycenia wartości, które przekazujemy do metody w trakcie wywoływania. Mówiąc po polsku: parametry to zmienne z okrągłego nawiasu, czyli w naszym przypadku pierwszaLiczba, drugaLiczba.
public void kalkulator(int pierwszaLiczba, int drugaLiczba){ int wynik = pierwszaLiczba + drugaLiczba; }
- Argument metody
To wartości przekazywane do metody podczas jej wywołania. To po prostu zmienne, która wysyłasz do metody, aby “ustawić” je jako parametr. W naszym przykładzie przekazujemy do metody kalkulator() wartość zmiennych int x oraz int y.
int x = 6; int y = 10; public void kalkulator(int pierwszaLiczba, int drugaLiczba){ int wynik = pierwszaLiczba + drugaLiczba; }
Metoda może przyjmować zarówno jeden, jak i wiele parametrów, np:
public int obliczBMI(int wzrost, int masa){ int bodyMassIndex = (masa /(wzrost * wzrost)); return bodyMassIndex; } public void pole(double PI, int promien){ double wynik = PI * Math.pow(promien,2); }
Pamietaj jednak, że jeśli metoda ma 2 parametry, a Ty przekazujesz do niej 1 argument, to kod się niestety nie skompiluje. To samo tyczy się zgodności typów. Nie możesz przekazać Stringa, jeśli paramter metody zakłada zmienną lokalną jest typ int.
int wagaJanka = 75; int wzrostJanka = 180; // To się skompiluje: public int obliczBMI(wagaJanka, wzrostJanka){ int bodyMassIndex = (masa /Math.pow(wzrostJanka,2)); return bodyMassIndex; } // To się nie skompiluje: public int obliczBMI(wzrostJanka){ // <------- nie przekazaliśmy wzrostju Janka int bodyMassIndex = (masa /Math.pow(wzrostJanka,2)); return bodyMassIndex; } // btw metoda Math.pow(x,2) podnosi wartość x do kwadratu ;)
Return
Czy Java ma coś wspólnego z Urzędem Skarbowym? Let’s take a look!
Każda metoda w Javie musi mieć zadeklarowany typ zwracany, np. int, czy też String. Co to oznacza?
Ja to rozumiem, jako możliwość wykorzystania pozostałości (wyniku) działania danej metody w innych miejscach w programie. Tak to działa z Urzędzem Skarbowym. Rozliczasz PIT, dostajesz zwrot (jeśli jesteś szczęściarzem) i możesz tą kase jakoś wykorzystać, np. kupić kurs programowania 😁
public class Dane{ public static void main(String [] args){ String daneOsobowe = zwrotTekstu("Jan", "Kowalski"); System.out.println("Imie gościa: " + daneOsobowe); // wypisujemy na ekranie wynik działania metody (dzięki RETURN) } static String zwrotTekstu(String imie, String nazwisko){ String imieNazwisko = imie + " " + nazwisko; return imieNazwisko; // <----------------------------------------RETURN // wartością zwracaną jest String } }
Przeanalizujmy. Stworzyliśmy metodę statyczną zwrotTekstu(), w której zostaną połączone ze sobą zmienne imie oraz nazwisko. W tym przykładzie wartością zwracana jest wartość zmiennej imieNazwisko. Stosujemy w tym celu komendę return, aby następnie wykorzystać imieNazwisko i wypisać dane na ekranie. Takie rozwiązanie jest użyteczne, kiedy wynik działania jednej metody chcemy wykorzystać w innej metodzie. Typ zwracany musi być taki sam, jak typ zadeklarowany przy tworzeniu metody (u nas String).
Czasem bywa tak, że Urząd Skarbowy nic nam nie zwróci. Jako, że w Javie metoda musi mieć jakiś typ zwracany, to deklarujemy go wtedy jako void. Dzięki temu mamy możliwość stworzenia metody, która nie będzie zwracała niczego, ale kompilator da nam spokój, bo przecież ustawiliśmy typ zwracany jako void. Metoda będzie po prostu wykonywać jakąś instrukcję, np:
public void sumaLiczb(int x, int y) { int suma = x + y; System.out.println("Suma liczb to ": + suma); //bez return; }
Pakiety
Wszystkie Klasy w Javie są umieszczone w pakietach. Każda Klasa znajdująca się w pakiecie jest umieszczona w odpowiednim katalogu.
package javamPokaze public class Kwadrat{ // kod naszej klasy w pakiecie javamPokaze }
Komenda import służy do zaimportowania Klasy z innego pakietu do Klasy, w której import stosujemy. Dzięki temu działaniu skorzystamy z danych, które nie znajdują się w tym samym pakiecie, co Klasa, w której pracujemy.
import javamPokaze; //zaimportowaliśmy dane z pakietu javamPokaze //Możmmy teraz stoworzyć Obiekt Klasy Kwadrat w aktualnej klasie FiguryGeometryczne public class FiguryGeometryczne{ Kwadrat pierwszaFigura = new Kwadrat(); }
Możemy też importować Klasy z konkretnych gotowych pakietów, które mamy dostępne w Javie:
import java.util.Random; public class Kot{ public static void main(String[] args){ Random ran = new Random(); System.out.println("Losowy numer to: " + ran.nextInt(100)); } }
W tym przykładzie importujemy Klasę Random z pakietu Java. Następnie korzystamy z metody nextInt().
Modyfikatory dostępu
W javie mamy kilka modyfikatorów. Określają one rodzaj dostępu do naszych danych w programie:
- public - masz dostęp do danych z poziomu wszystkich Klas całego programu (we wszystkich pakietach)
- private - masz dostęp do danych jedynie z poziomu konkretnej Klasy (brak dostępu w innych Klasach, nawet jeśli znajdują się w tym samym pakiecie)
- default (nasz domyślny, czyli po prostu brak modyfikatora)
Mamy jeszcze protected, ale tym się teraz nie bedziemy zajmować.
Enkapsulacja i konwencja JavaBeans
Tak, enkapsulacja to jedno podstawowych pojęć programowania obiektowego w Javie. To nic więcej jak ukrywanie szczegółów Klasy przed innymi Klasami w programie. Składa się na to m.in. deklarowanie pól jako prywatnych i udostępnianie ich tylko poprzez publiczne metody (tzw. gettery i settery).
Konwencja JavaBeans to zestaw reguł tworzenia Klas w Javie. Te zasady pozwalają na ochrone danych przed niekontrolowaną zmianą, np. przez innych programistów w trakcie wspólnej pracy nad kodem. Według tej konwencji, powinnismy ograniczać dostęp do szczegółów działania naszej Klasy i udostępniać publicznie tylko niektóre elementy. Używamy tutaj logiki enkapsulacji, czyli najważniejsze dla nas będzie ustawianie zmiennych instancji (pól Klasy) jako prywatne, oraz stostowanie getterów i setterów.
Getters and Setters
Gettery to metody udostepniające dane, a settery ustawiające dane. Obydwa rodzaje metod powinny posiadać publiczny modyfikator dostępu. Tyle. Oto przykłady, dla lepszego zrozumienia:
public class Kino{ private int cenaBiletu; private String nazwaFilmu; public void setCenaBiletu(int cenaBiletu){ // <---- Setter1: ustawia cenę biletu this.cenaBiletu = cenaBiletu; } public String getCenaBiletu() // <---- Getter1: zwraca cenę biletu (ustawioną w Setter) return cenaBiletu; public void setNazwaFilmu(String nazwaFilmu){ // <---- Setter2: ustawia nazwę filmu this.nazwaFilmu = nazwaFilmu; } public String getNazwaFilmu() // <---- Getter2: zwraca nazwę filmu (ustawioną w Setter) return nazwaFilmu; }
W Setterach pojawia się coś takiego jak “this.” Co oznacza?
Przykładowo, W metodzie setCenaBiletu jako parameter int cenaBiletu ustawiliśmy pole klasy Kino private int cenaBiletu. Z uwagi na to, że nazwa zmiennej lokalnej oraz pola klasy są takie same to… odróżnić je możemy za pomocą specyfikatora "this." Oznacza to po polsku coś takiego: weź Pole klasy private int cenaBiletu i ustaw jako int cenaBiletu.
Sprawdzimy działanie getterów i setterów Klasy Kino w Klasie testowej TestKina :
public class TestKina{ public static void main(String [] args){ Kino seansPoranny= new Kino(); seansPoranny.setNazwafilmu("Shrek"); // ustawiamy nazwę 1 filmu używając settera seansPoranny.setNazwafilmu(20); // ustawiamy cenę 1 biletu używając settera Kino seansWieczorny= new Kino(); seansWieczorny.setNazwafilmu("Teksańska Masakra Piłą Łańcuchową 3"); // setter 2 filmu seansWieczorny.setCenaBiletu(25); // setter 2 filmu System.out.println("Film dla dzieci: " + filmPoranny.getNazwaFilmu()); System.out.println("Cena: " + filmPoranny.getCenaBiletu()); System.out.println("Film dla dzieci: " + filmWieczorny.getNazwaFilmu()); System.out.println("Cena: " + filmWieczorny.getCenaBiletu()); // Wyświetlamy nazwy i ceny filmów, używając getterów }
Settery są bardzo przydatne podczas pisania rozbudowanych aplikacji, np. jeśli nagle okaże się, że potrzebujesz zmienić jakieś parametry w programie. Możesz uniknąć całkowitego wykrzaczenia się kodu właśnie dzięki setterom, które ustawiają konkretne wartości. Nikt Ci też w kodzie nie namiesza, bo aby zmienić wartość konkretnej zmiennej nie może tego zrobić “z marszu”, ale musi na Obiekcie wywołać metodę setter.
Gettery i settery możesz w wykorzystać na różnych strukturach danych, np. tablicach:
Film[]lista = new Film[6]; lista[0].setNazwa = "Rocky 5"; lista[1].setNazwa = "Killer"; //itd.
Zmienne instancji vs Zmienne lokalne
Na koniec mały dodatek, dotyczący wartości jakie przyjmują zmienne instancji oraz zmienne lokalne zaraz po zadeklarowaniu.
- Zmienne instancji (pola Klasy) zawsze po deklaracji mają przypisaną jakąś wartość z “defaultu”:
public class Zmienne{ int x; // 0 float y; // 0.0 boolean ifTrue; // false Cat cat = new Cat(); // null /* nawet jeśli podczas deklaracji nie przypiszesz im żadnych wartości, to z automatu Java sama im te wartości nada */ }
- Zmienne lokalne (w środku metody) po deklaracji nie mają z góry przypisywanych żadnych wartości. Dlatego zawsze po deklaracji musisz wykonać inicjalizację (nadać im wartość):
public int dodajLiczby() int x; int y = x + 2; } // Kod się nie skompiluje // Zmienna lokalna w metodzie musi mieć przypisaną wartość!
Śledź mnie na LinkedIn
Newsletter
Jeśli masz jakieś sugestie lub pytania, proszę napisz do mnie wiadomość: kuba@javampokaze.pl