Klasy nadrzędne i podrzędne posiadające tego samego członka danych w Javie

W C++ wszystkie metody składowe klasy są niewirtualne. Aby to zrobić, musimy użyć słowa kluczowego jako przedrostka, znanego jako faktyczny . Podczas gdy w Javie wszystkie metody składowe klasy są domyślnie wirtualne. Aby uczynić je niewirtualnymi, używamy słowa kluczowego finał .

Zmienne referencyjne w Javie to w zasadzie zmienne przechowujące adres obiektu w formacie szesnastkowym, który później jest konwertowany do systemu binarnego, który w zasadzie jest adresem obiektu, który ma być przechowywany w pamięci sterty.

Nie można obliczyć zmiennych referencyjnych różniących się od typów pierwotnych rozmiarem. W Javie zmienna referencyjna klasy Parent może przechowywać zarówno referencje do obiektu, jak i referencje do obiektu podrzędnego. Przyjrzyjmy się członom niebędącym metodą na przykładzie.

Przykład:

Java
   // Java Program to Demonstrate that Non-method Members   // are Accessed according to Reference Type   // (Unlike methods that are accessed according   // to the referred object)   // Class 1   // Super class   class   Parent     {      int     value     =     1000  ;      // Constructor of super class      Parent  ()      {      // Print statement      System  .  out  .  println  (  'Parent Constructor'  );      }   }   // Class 2   // Sub class   class   Child     extends     Parent     {      int     value     =     10  ;      // Constructor of sub class      Child  ()      {      // Print statement      System  .  out  .  println  (  'Child Constructor'  );      }   }   // Class 3   // Main class   class   GFG     {      // Main driver method      public     static     void     main  (  String  []     args  )      {      // Creating an object of sub class inside main()      // method      Child     obj     =     new     Child  ();      // Printing the reference of child type      System  .  out  .  println  (  'Reference of Child Type :'      +     obj  .  value  );      // Note that doing 'Parent par = new Child()'      // would produce same result      Parent     par     =     obj  ;      // Par holding obj will access the value      // variable of parent class      // Printing the reference of parent type      System  .  out  .  println  (  'Reference of Parent Type : '      +     par  .  value  );      }   }   

Wyjście
Parent Constructor Child Constructor Reference of Child Type :10 Reference of Parent Type : 1000 

Wyjaśnienie wyjścia: Jeśli nadrzędna zmienna referencyjna przechowuje odwołanie do klasy podrzędnej, a zmienna „wartość” znajduje się zarówno w klasie nadrzędnej, jak i podrzędnej, będzie ona odnosić się do zmiennej „wartość” klasy nadrzędnej, niezależnie od tego, czy zawiera ona odniesienie do obiektu klasy podrzędnej. Odwołanie przechowujące odwołanie do obiektu klasy podrzędnej nie będzie mogło uzyskać dostępu do elementów (funkcji lub zmiennych) klasy podrzędnej. Dzieje się tak, ponieważ nadrzędna zmienna referencyjna może uzyskać dostęp tylko do pól znajdujących się w klasie nadrzędnej. Zatem typ zmiennej referencyjnej decyduje, która wersja „wartości” zostanie wywołana, a nie typ tworzonego obiektu. Dzieje się tak dlatego, że kompilator używa specjalnego mechanizmu polimorfizmu w czasie wykonywania tylko dla metod. (Tam typ tworzonego obiektu decyduje, która wersja metody ma zostać wywołana).

Notatka: Dostęp do podrzędnych elementów danych można uzyskać za pomocą wskaźnika nadrzędnego z rzutowaniem typów.