1. Odwołania do składowych klasy. Zmienna this
Nareszcie nadeszła pora na szczegółowe omówienie konstrukcji klasy Para. class Para { int a; // To są "dane" (zwane polami klasy). // Określają one z jakich elementów składać się int b; // będą obiekty tej klasy. // a = pierwszy składnik pary, b - drugi Para(int x, int y) { // konstruktor: nadaje wartość parze a = x ; // na podstawie przekazanych wartości x i y b = y; } Para(int x) { // inny konstruktor: nadaje obu składnikom pary a = b = x; // (a i b) tę samą wartość x } void set(Para p) { // metoda ustalenia wartości pary a = p.a; // na podstawie składników przekazanej pary b = p.b; } Para add(Para p) { // metoda dodawania dwóch par Para wynik = new Para(a, b); wynik.a += p.a; wynik.b += p.b; return wynik; } // metoda pokazująca parę void show(String s) { System.out.println(s + " ( " + a + " , " + b + " )" ); } }
W innej klasie możemy użyć klasy Para, np. tak: class ParaTest { public static void main(String[] args) { Para para1 = new Para(1,5); Para para2 = new Para(2,4); para1.show("Para 1 ="); para2.show("Para 2 ="); Para sumaPar = para1.add(para2); sumaPar.show("Suma par ="); para1.set(para2); para1.show("Teraz para 1 = "); } } Para 1 = ( 1 , 5 )
Para 2 = ( 2 , 4 ) Suma par = ( 3 , 9 ) Teraz para 1 = ( 2 , 4 ) Powyższy program wyprowadzi na konsolę następujące wyniki. Zobaczmy co się naprawdę dzieje.
Gdy piszemy:
Podobnie możemy napisać: para1 "wygląda" tak para2 "wygląda" tak Pola: Pola: int a; ( = 1) int a; ( = 2) int b; ( = 5) int b; ( = 4) --------------------------------------------- Metody: Metody: void set(...) void set(...) Para add(...) Para add(...) void show(...) void show(...)
Identyfikatory pól i metod są takie same! Uwagi:
Zajrzyjmy teraz do wnętrza klasy. Skąd wiadomo co konkretnie oznacza a i b w konstruktorze albo w metodzie set? Wyrażenie new najpierw tworzy obiekt, a później wywoływany jest konstruktor. Zatem w momencie rozpoczęcia działania konstruktora obiekt już istnieje (jest mu przydzielona pamięć na przechowanie dwóch liczb całkowitych, ich wartości zostały inicjalnie określone, w naszym przypadku jako zera). Wykonanie konstruktora dotyczy właśnie tego nowoutworzonego obiektu. W konstruktorze dostępna jest referencja do tego obiektu w postaci niejawnie zdefiniowanej zmiennej o nazwie this. (this = TEN). Słowo this jest słowem kluczowym języka
Zatem this.a i this.b - zgodnie z interpretacją znaczenia kropki to pola a i b tego obiektu, którego dotyczą inicjacje wykonywane przez konstruktor. ![]() Ponieważ i tak wiadomo, że samo a i b dotyczy pól (elementów) tego obiektu,
dla którego akurat wołany jest konstruktor, to słowo this możemy pominąć.
To samo dotyczy metod wywoływanych na rzecz obiektów.
TEN obiekt na rzecz którego wywołano metodę jest wewnątrz metody reprezentowany słowem kluczowym this. ![]()
I znowu możemy pominąć słówko this, bo tu jasne jest z kontekstu.
Zobaczmy teraz jak działa metoda dodawania dwóch par. Po pierwsze: mamy dwie pary, które chcemy dodać - wobec tego silna jest
pokusa by użyć metody z dwoma argumentami. Ale przecież programujemy obiektowo:
pierwsza z par do której dodajemy drugą będzie obiektem do którego poślemy
polecenie add:
para1.add(para2);
Po drugie: co zrobić z wynikiem dodawania? ![]()
Gydbyśmy w klasie Para mieli na przykład dwie metody getA() i getB(), które
zwracają odpowiednie składniki pary, to w innej metodzie klasy (np. metodzie
sumującej składniki pary) moglibyśmy się do nich odwołać: class Para { int a; int b; Para(int a, int b) { this.a = a; // polu a obiektu przypisz wartość parametru a this.b = b; // polu b obiektu przypisz wartość parametru b } void set(int a, int b) { this.a = a; this.b = b; } } Więcej na temat przesłaniania identyfikatorów pod koniec wykładu.
|