2017-06-10 3 views
0

Wenn ein Subklasse Objekt zu ihrer Oberklasse gegossen wird, zum BeispielBestimmung der Methode überschreibt aufgerufen tatsächlich

Superclass obj = new Subclass(); 

und die Klassen

public class Superclass{ 
    public void thisMethod(){ 
     System.out.println("Superclass version was executed"); 
} 

und

public class Subclass extends Superclass{ 
    public void thisMethod(){ 
     System.out.println("Subclass version was called"); 
} 
    public void newMethod(){ 
     System.out.println("blah"); 
    } 
} 

definiert wurden, wenn obj.thisMethod() wurde aufgerufen, ich bekomme Subclass version was called als Ausgang, was natürlich die ve bedeutet Diese Methode, die in der Unterklasse definiert wurde (die Version, die ein originelles Superklassenobjekt nicht ausführen kann) wurde aufgerufen, obwohl der deklarierte Typ Superklasse ist, ja? Also, wenn auch die Unterklasse Methode auf Obj, ausgeführt wurde, wenn obj.newMethod() aufgerufen wird, bekomme ich einen Kompilierfehler.

Warum wird die in der Unterklasse definierte Version von thisMethod() über das Superklassenobjekt obj aufgerufen? Ich verstehe, dass der eigentliche Typ von obj immer noch Unterklasse ist, also natürlich sollte die neue Version aufgerufen werden, aber dann, sollte ich nicht obj.newMethod() anrufen können?

Dankhaufen für irgendwelche Erklärungen (:

edit: * im Titel

Antwort

7

Grundsätzlich überschrieben gemeint, warum ist die Version von thisMethod() in der Unterklasse definiert durch das Objekt obj übergeordneten Klasse aufgerufen wird ?

Denn das ist im Grunde der Punkt der Vererbung - es ermöglicht eine Implementierung außer Kraft zu setzen, ohne die Telefonvorwahl wissen zu müssen, welche Implementierung verwendet wird Nehmen InputStream wie. ein Beispiel - Sie können Code verwenden InputStream, und dann der gleiche Code funktioniert, ob Sie eine FileInputStream, eine ByteArrayInputStream usw. übergeben. Im Falle einer abstrakten Klasse oder Schnittstelle, rufen Sie möglicherweise Methoden, die nicht haben jede Implementierung in der Art der Kompilierung - aber es ist garantiert, dass es eine Implementierung in dem konkreten Objekttyp geben wird, der zur Ausführungszeit verwendet wird.

Ich verstehe, dass die tatsächliche Art von obj noch Subclass ist, so natürlich, die neue Version soll aufgerufen werden, aber dann soll ich obj.newMethod() nicht in der Lage sein zu nennen? Keine

, weil die Kompilierung- Art von obj ist Superclass. Es ist wirklich wichtig, zwischen dem Typ einer Variablen zu unterscheiden, der bestimmt, welche Methoden usw. verfügbar sind, und Ausführungszeit Typ des Objekts, auf das sich der Wert der Variablen bezieht, der bestimmt, welche Implementierungen tatsächlich sind namens.

Das ist nur eine sehr kurze Beschreibung - Sie sollten ein gutes Java-Buch Kapitel Vererbung für weitere Details lesen.

0

Superklasse obj = new Unterklasse() In dieser Definition können Sie nur die exposed-Methode in Superklasse verwenden.Und tatsächlich in Ihrer Erklärung zeigt Objekt zu Unterklasse, wenn Sie eine Methode aufrufen, wird es

Unterklasse Implementierung obj
1

In der Theorie nennen, ist ein Superclass Referenz die auf eine Subclass Objekt.

Für den Compiler obj ist nur ein Superclass, so können alle Superclass Methoden z. thisMethod, der Compiler kennt den Typ des Objekts nicht, nur den Typ des Verweises, deshalb lehnt der Compiler newMethod ab, weil er nicht beweisen kann, dass diese Methode existiert.

Aber zur Laufzeit wird der Typ des Objekts verwendet, um Methoden zu versenden, nicht die Art der Referenz, so thisMethod wird gelöst zu Subclass 's Version.

Nun, wenn wir wissen, dass das Laufzeitobjekt des Typs Subclass wir den Compiler diese sagen wollen, tun wir eine Besetzung:

Subclass subobj = (Subclass) obj; 

Danach wird der Compiler weiß, dass subobj vom Typ Subclass und akzeptiert Aufruf newMethod, die Besetzung ist nur eine Info für den Compiler und ändert nichts im Objekt obj, hatte obj wurde kein Subclass die vorherige Anweisung wird ClassCastException zur Laufzeit werfen.

Verwandte Themen