Wpis z mikrobloga

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.


Czyli podklasa dziedziczy metody które mogą działać na nieodziedziczonych polach.

Rozumiem, że gdy tworzy się instancja podklasy to tworzy się również instancja nadklasy (albo jawnie super, albo niejawne dodanie wywołania bezargumentowego konstruktora nadklasy)

Czy gdy wywołuje childObject.parentMethod() i metoda potrzebuje prywatnych składowych nadklasy to w tych przypadkach niejawnie odwołuje się do instancji nadklasy za pomocą czegoś w stylu super.privateMember?

Chodzi mi o to, że taka metoda parentMethod() powinna mieć aktualny kontekst instancji podklasy (np. aktualne wartości odziedziczonych pól w podklasie) i prywatny kontekst instancji nadklasy. Czyli to by implikowało, że podklasa musi mieć jakieś odniesienie do instancji nadklasy, które jest dostepne dla kompilatora ale nie do piszącego kod w podklasie.

#java #naukaprogramowania #programowanie
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Lewo: ale namieszałeś.

Instancja jest jedna, tylko prywatne pola są po prostu niewidoczne z punktu widzenia klasy (czyli z ciała klasy i ciała metod), która dziedziczy. Wywołanie metody childObject.parentMethod() wywołuje bezpośrednio metodę nadklasy (nawet jeśli masz referencję typu podklasy) - zakładam tu oczywiście, że nie przedefiniowałeś tej samej metody w podklasie, bo wtedy zachowanie jest trochę bardziej skomplikowane.
  • Odpowiedz
@Lewo: instancja podklasy nie zawiera w sobie instacji nadklasy, bo instancja jest jedna, ma pola prywatne nadklasy ale nie możesz się do nich odwołać z podklasy bo są private
  • Odpowiedz
@Lewo: to jest kwestia nazewnictwa - co to znaczy, że pole jest inherited?

Fizycznie w pamięci w obiekcie klasy dziedziczącej te prywatne pola klasy nadrzędnej są. Nawet, jak nie odwołujesz się do nich z żadnej nieprywatnej metody.

Natomiast dostępu do nich z klasy dziedziczącej nie masz, chyba, że zrobisz jakeiś metody na to pozwalające w klasie nadrzędnej.

IMHO ten opis jest z dupy, bo sugeruje, że te pola się pojawiają
  • Odpowiedz
@tell_me_more: @SuppressWarnings: @beethoven: czyli prywatne składowe są dziedziczone, tylko nie można do nich się bezpośrednio odwołać. Dzięki.

Zmylił mnie cytowany fragment i to, że jest zawsze wywoływany jest konstruktor nadklasy.
Czyli konstruktor nadklasy jest wywoływany po to by zainicjalizować odziedziczone składowe w podklasie (nie utworzy tymczasowo obiektu nadklasy z zainicjalizowanymi składowymi które dopiero wtedy dziedziczę)?
  • Odpowiedz