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.