2016-07-08 5 views
1

sagen, dass ich den folgenden CodeWas ist die Verwendung von Java virtuelle Methodenaufruf?

public class A { 
    public void callme() { 
    System.out.println("Calling of class A function "); 
    } 
} 

public class B extends A { 
    public void callme() { 
    System.out.println(" Calling of class B fuction "); 
    } 

    public void Hello() { 
    System.out.println("hello guys"); 
    } 
} 

und ein main(), das tut das folgende

public class Main { 
    public static void main(String [] args){ 
    A a = new B(); 
    B b = new B(); 

    b = (B)a; 
    a.callme(); 
    b.callme(); 
    a.Hello(); // show error : Hello is undefined for method A 
    } 
} 

Das Buch sagt: „Sie das Verhalten bekommen, die mit dem Objekt, auf das das Variable zur Laufzeit bezieht sich habe ". Ok, ich bekomme Verhalten von B-Klasse, wenn eine Methode Callme aufgerufen wird, aber wenn ich auf die Methode Hello zugreifen, zeigt es einen Fehler, dass Hello für Methode A nicht definiert ist. Warum ist das?

+1

Da die Variable 'a' vom Typ' A' und Klasse 'A' keine' Hello' Methode hat. – Jesper

+0

Verhalten! = Schnittstelle – Fildor

Antwort

0

a ist vom Typ A, auch wenn es sich auf eine Instanz von B bezieht.

A hat nicht die Hello Methode (auch eine abstract Deklaration). Ihr Compiler gibt also den Fehler aus. Stellen Sie Ihren Code leicht auf

wäre eine Lösung. A nimmt dann die Eigenschaften einer Schnittstelle an.

1

Polymorphismus funktioniert nicht so. Da A Eltern von B ist, kann B Methoden von A erben (wie Sohn Eigenschaften von Vater erben kann), aber nicht umgekehrt, weil A nicht weiß, welche Klassen es erben (A weiß nicht, wer seine Kinder sind).

Beispiel: Angenommen, es eine weitere Klasse C:

public class C extends A { 
public void callme(){ 

System.out.println(" Calling of class C fuction "); 
} 

public void Hello(){ 

System.out.println("hello guys, I am C"); 
} 
} 

Nun, wenn Sie

a.Hello(); 

verwenden, wie ein Know welches Kind Klasse nennen sollte, da es nicht Methoden sein Kind. nur eine eigene abstrakte Methode, die das Kind sicher beherrschen wird.

+0

Also, was ist der Vorteil von A a = neue B(); // virtuelle Methodenaufruf .. Ich hätte einfach das Objekt der B-Klasse verwendet, um die Funktionen aufzurufen. Warum verwenden wir virale Methodenaufrufe? –

0
public class B extends A { 
public void callme(){ 

System.out.println(" Calling of class B fuction "); 
} 

public void Hello(){ // hello method is only the part of class B not A. 

System.out.println("hello guys"); 
} 
} 

In obiger Klasse hello() Methode ist nur ein Teil von B. es nicht

nach der Methode von A. außer Kraft setzen

jetzt in der Hauptmethodenaufruf

public static void main(String [] args){ 
A a= new B(); // object of b referred by (a) Reference Variable of A 
B b= new B(); // object of b referred by (b) Reference Variable of B 

b= (B)a; 
a.callme(); //override takes place and method of B's Callme() called 
b.callme(); //again override takes place here and method of B's Callme() called 
a.Hello();// buttttttt 
b.Hello(); // this will compile and executes fine. 
} 
} 

Hier verwendet man die Bezugsgröße der Klasse A, die haben keine Methodennamen Hello(). Also, Method Resolution wird nicht stattfinden (wird keine Methode wie Hello() finden).

aber wenn Sie versuchen, b.Hello() mit der Referenzvariablen von B aufrufen, dann wird es gut für Sie arbeiten.

Angenommen, es gibt eine weitere Klasse C, die eine Unterklasse von A ist und einen Methodennamen Hello() enthält.

public class C extends A { 

    public void Hello(){ // hello method is only the part of class B not A. 

    System.out.println("hello guys"); 
    } 
    } 

In Haupt einem Statement wie dieses

A a = new C(); 

und wenn Sie versuchen, a.Hello() dann rufen die Hello() Methode aufrufen wird.Der Compiler wird verwirrt sein.

Also, dieses Konzept funktioniert nur, wenn Sie versuchen, die Methode der Superklasse in Unterklasse zu überschreiben.

0

Ist der Elternklasse von abgeleiteten Klassen bekannt?

Casting verändert nicht den tatsächlichen Objekttyp. Nur der Referenztyp wird geändert.

empfehle ich Ihnen meinen Upcasting mit einziehenden Schreiben von the link