Classes pai e filho com o mesmo membro de dados em Java

Em C++, temos todos os métodos dos membros da classe como não virtuais. Para fazer isso, temos que usar uma palavra-chave como prefixo conhecido como virtual . Enquanto em Java temos todos os métodos de membros de classe como virtuais por padrão. Para torná-los não virtuais, usamos a palavra-chave final .

Variáveis ​​​​de referência em Java são basicamente variáveis ​​​​que contêm o endereço do objeto em tipo hexadecimal que posteriormente é convertido para o sistema binário que basicamente é o endereço do objeto a ser armazenado na memória heap.

Variáveis ​​de referência que diferem dos tipos primitivos porque seu tamanho não pode ser calculado. Em Java, a variável de referência da classe Parent é capaz de conter sua referência de objeto, bem como sua referência de objeto filho. Vejamos os membros que não são métodos com a ajuda de um exemplo.

Exemplo:

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

Saída
Parent Constructor Child Constructor Reference of Child Type :10 Reference of Parent Type : 1000 

Explicação de saída: Se uma variável de referência pai estiver mantendo a referência da classe filha e tivermos a variável 'valor' nas classes pai e filha, ela se referirá à variável 'valor' da classe pai, independentemente de estar mantendo a referência do objeto da classe filha. A referência que contém a referência do objeto da classe filha não poderá acessar os membros (funções ou variáveis) da classe filha. Isso ocorre porque a variável de referência pai só pode acessar campos que estão na classe pai. Assim, o tipo de variável de referência decide qual versão do 'valor' será chamada e não o tipo de objeto que está sendo instanciado. Isso ocorre porque o compilador usa um mecanismo especial de polimorfismo em tempo de execução apenas para métodos. (Lá o tipo de objeto que está sendo instanciado decide qual versão do método será chamada).

Observação: É possível acessar membros de dados filhos usando ponteiro pai com conversão de tipo.