2016-06-03 15 views
2

Ich habe drei Klassen namens A, B und Test-Klasse und jede Klasse verfügt über drei Methoden wie im folgenden Code. Jetzt erstelle ich aus der Klasse Test ein Objekt der Klasse B und lege es in A, welches die Elternklasse ist. Jetzt wird die Methode von A nicht aufgerufen, aber die Methode von B wird aufgerufen, warum? Auch wenn ich die Methoden als statisch mache, wird die Methode der Klasse A aufgerufen. Was ist der Grund dafür?Aufruf von Methoden in Multilevel-Vererbung

class A { 
    void test1() { 
     System.out.println("hello"); 
    } 
} 

class B extends A { 
    void test1() { 
     System.out.println("From B class"); 
    } 
} 

class Test extends B{ 
    public static void main(String args[]){ 
     A obj=new B(); 
     obj.test1(); 
    } 

    public void test1(){ 
     System.out.println("from Test class"); 
    } 
} 
+0

Polymorphismus ist der Grund .. 'obj' ist definiert als' A', bezieht sich aber auf eine Instanz von 'B', daher' obj.test1() 'ruft' B # test1' auf. Und da 'statische' Methoden nicht überschrieben werden, rufen sie 'obj.test1' auf (während es technisch' A.test1' sein sollte), wobei 'A # test1' statisch ist und' obj' als 'A' definiert ist Ein # test1'. – SomeJavaGuy

Antwort

0

Das Verhalten, das Sie beschreiben genau, wie es soll in Java sein, wo eine Methode, mit virtueller Standard ist. Der Zugriff auf die Instanz B, die Sie verwenden, hängt vom tatsächlichen Typ des Werts ab, der von obj referenziert wird (B), nicht vom Typ der Referenz obj wie deklariert (also A). Wenn die Methoden statisch gemacht werden, wird auf die spezifische Klasse verwiesen.

0

weil Sie die Methode sind überschreiben, fron A mit B, müssen Sie Polymorphismus

0

Bei Runtime untersucht, die überschriebene Methode aufgerufen. Statische Methoden können nicht überschrieben werden, stattdessen können Sie die übergeordnete Implementierung aus der untergeordneten Klasse ausblenden.

Dies wird NICHT hängen vom Referenztyp.

A obj = new B(); 
obj.test1();//Method on B will be invoked. 

B obj = new B(); 
obj.test1();//Still method on B will be invoked.Because at runtime we have B obj 

Denn: Sie spezifische Implementierung zur Verfügung gestellt haben für Ihre test Methode in B Art von Objekten. Please read about Polymorphism.

+0

Ein obj = neues B(); obj.test1(); // Methode auf B wird aufgerufen. Ich habe diese Sache nicht verstanden, warum die Methode von B anstelle der Methode in A aufgerufen wird –

0

Der erste Fall bezieht sich auf dynamische (oder späte) Bindung. Der Compiler ermittelt den Objekttyp in Runtime, sodass in Runtime die bestimmte Methode des bestimmten Objekts zum Aufruf ausgewählt wird. Der zweite Fall bezieht sich auf statische (oder frühe) Bindung. Der Compiler weiß, dass die statische Methode nicht überschrieben werden kann, sodass sie zur Kompilierungszeit gebunden werden kann. Als die statische Methode, die sich auf ihre Klasse bezieht, aber nicht auf die bestimmte Instanz dieser Klasse, wird die Methode dieser Klasse (in Ihrem Fall ist es A) aufgerufen.

1

In Ihrer Klassendefinitionen Methode Test1() in Kindklasse (dh B) überschreibt die Methode in übergeordneter Klasse definiert (dh A)

Der folgenden Code erzeugt eine Objektinstanz B vom Typ ‚A‘ unter Verwendung von Referenz

A obj = new B(); 

Alle nicht-statische Methoden werden auf tatsächlichen Instanz aufgerufen werden (dh der Klasse B)

Alle statischen Verfahren wird es zur Klasse A. statische Methoden beziehen wird daher auf Bezugs aufgerufen werden können nicht überschrieben werden.

Verwandte Themen