Classi padre e figlio con lo stesso membro dati in Java

In C++ abbiamo tutti i metodi dei membri della classe come non virtuali. Per fare ciò dobbiamo utilizzare una parola chiave come prefisso noto come virtuale . Mentre in Java abbiamo tutti i metodi dei membri della classe come virtuali per impostazione predefinita. Per renderli non virtuali utilizziamo la parola chiave finale .

Le variabili di riferimento in Java sono fondamentalmente variabili che contengono l'indirizzo dell'oggetto in tipo esadecimale che successivamente viene convertito nel sistema binario che fondamentalmente è l'indirizzo dell'oggetto da archiviare nella memoria heap.

Le variabili di riferimento che differiscono dai tipi primitivi poiché la loro dimensione non può essere calcolata. In Java la variabile di riferimento della classe Parent è in grado di contenere il riferimento all'oggetto così come il riferimento all'oggetto figlio. Vediamo i membri non-metodo con l'aiuto di un esempio.

Esempio:

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  );      }   }   

Produzione
Parent Constructor Child Constructor Reference of Child Type :10 Reference of Parent Type : 1000 

Spiegazione dell'uscita: Se una variabile di riferimento genitore contiene il riferimento della classe figlia e abbiamo la variabile 'valore' sia nella classe genitore che in quella figlia, farà riferimento alla variabile 'valore' della classe genitore se contiene il riferimento all'oggetto della classe figlia. Il riferimento che contiene il riferimento all'oggetto della classe figlia non sarà in grado di accedere ai membri (funzioni o variabili) della classe figlia. Questo perché la variabile di riferimento genitore può accedere solo ai campi che si trovano nella classe genitore. Pertanto il tipo di variabile di riferimento decide quale versione di "valore" verrà chiamata e non il tipo di oggetto di cui si sta istanziando. Ciò avviene perché il compilatore utilizza uno speciale meccanismo di polimorfismo in fase di esecuzione solo per i metodi. (Qui il tipo di oggetto da istanziare decide quale versione del metodo chiamare).

Nota: È reso possibile accedere ai membri dati figlio utilizzando il puntatore genitore con typecasting.