No to jedziemy... Nie mniej fajnie jakbyśnapisał, który konkretnie wynik Cię dziwi.
System.out.println("o1.a = " + o1.a);
Wyświetla pole a z klasy A, które nadawane jest w konstruktorze tej klasy:
public A(){
c=c+2;
a=c;
}
c inicjalizowane jest jako 7 i do tego jest polem statycznym dla każdej instancji o1 oraz o2 są to te same pola! JEDNO WSPÓLNE! StackTrace zatem to:
c=7 c+2 a=c wynika z tego a=9
System.out.println("o1.m(o1.a) = " + o1.m(o1.a));
do metody m(int x) przekazujemy wartość 9 opisane skąd to się wzięło powyżej. Metoda m(int 9) mnoży pole a (samej siebie) razy to co dostała w argumencie(uprzedmio odejmując 1) zatem stacktrace:
a=9 argument x=9 dalej od x-1 wynik 9*8 = 72
System.out.println("o1.a = " + o1.a);
tutaj wciąż mamy 9 bo nie robiliśmy zmian na naszym obiekcie o1 (a dokładnie jakie polu a)
System.out.println("c = " + c);
Tu odwołujemy się do pola c, ale jest to pole statyczne. jako że klasa B rozszerza klasę A jest to dokładnie to samo pole statyczne i jest wciąż równe 9
System.out.println("o2.a = " + o2.a);
o2 jest tworzony przez konstruktor klasy A, skoro c=9, a+2=11
System.out.println("o2.m(5) = " + o2.m(5));
pole a = 11 więc 11 * 4 = 44. Niestety tak się nie wyświetla. Dzieje się tak ponieważ zarówno klasa A jak i rozszerzająca ją klasa B ma pole o takiej samej nazwie. I TO JEST IDIOTYCZNE! NIE RÓB TAK NIGDY! metoda m wywoływana jest na klasie A zatem do obliczeń brane jest pole a klasy A nie jak by można przypuszczać pole a klasy B.
Wartość pola a klasy A w obiekcie o2 równe jest 3, a wynika to z konstruktora klasy rozszerzającej B.
System.out.println("o2.a = " + o2.a);
to zostało juz wcześniej opisane. Gdybyś chciał się przekonać jaka jest wartość pola a
System.out.println("c = " + c);
No tutaj to bez zmian
System.out.println("o3.a = " + o3.a);
W momencie tworzenia tego obiektu pole c miało wartość 3, nie 9 jak obecnie dlatego wartość pola a jest równa 9 co wynika z konstruktora.
Mam nadzieję, że pomogłem nie mniej nie twórz NIGDY pól o takiej samej nazwie. Namierzenie błędów staje się niemożliwe w rozbudowanych aplikacjach. Jeśli jakiś nauczyciel wam daje coś takiego to powiedź mu, że programowanie obiektowe nie zostało stworzone po to by męczyć idiotycznymi zawiłościami algebraicznymi uczniów.