In C++ hebben we alle klassenlidmethoden als niet-virtueel. Om dit te doen, moeten we een trefwoord als voorvoegsel gebruiken, bekend als virtueel . Terwijl we in Java standaard alle klassenlidmethoden als virtueel hebben. Om ze niet-virtueel te maken, gebruiken we het trefwoord definitief .
Referentievariabelen in Java zijn in feite variabelen die het adres van het object in hexadecimale vorm bevatten, dat later wordt geconverteerd naar het binaire systeem dat in feite het adres is van het object dat in het heapgeheugen moet worden opgeslagen.
Referentievariabelen die qua grootte verschillen van primitieve typen, kunnen niet worden berekend. In Java kan de referentievariabele van de klasse Parent zowel de objectreferentie als de onderliggende objectreferentie bevatten. Laten we eens kijken naar niet-methodeleden met behulp van een voorbeeld.
Voorbeeld:
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); } }
Uitvoer
Parent Constructor Child Constructor Reference of Child Type :10 Reference of Parent Type : 1000
Uitvoer uitleg: Als een ouderreferentievariabele de referentie van de kindklasse bevat en we hebben de 'waarde'-variabele in zowel de ouder- als de kindklasse, zal deze verwijzen naar de' waarde'-variabele van de ouderklasse, ongeacht of deze de objectreferentie van de kindklasse bevat. De referentie die de objectreferentie van de onderliggende klasse bevat, heeft geen toegang tot de leden (functies of variabelen) van de onderliggende klasse. Dit komt omdat de bovenliggende referentievariabele alleen toegang heeft tot velden die zich in de bovenliggende klasse bevinden. Het type referentievariabele bepaalt dus welke versie van 'waarde' wordt aangeroepen en niet het type object dat wordt geïnstantieerd. Dit komt doordat de compiler alleen voor methoden een speciaal runtime-polymorfismemechanisme gebruikt. (Daar bepaalt het type object dat wordt geïnstantieerd welke versie van de methode moet worden aangeroepen).
Opmerking: Het is mogelijk gemaakt om toegang te krijgen tot onderliggende gegevensleden met behulp van de ouderaanwijzer met typecasting.