Wie funktioniert die Vererbung in Java?

8

Wir haben nächste Klassen:

%Vor%

Ausgabe ist:

  

Super

     

Sub

Fragen:

Was ist super vorhanden? Ist es ein Objekt der Elternklasse, welches Kind als Feld behält?

  • Wenn ja, wie funktioniert die Vererbung von abstrakten Klassen? Sie können keine Instanz der abstrakten Klasse erstellen.
  • Wenn nicht, wo wird die überschriebene Methode beibehalten?

Ich habe versucht, Google, aber alles, was ich gefunden habe, ist gemeinsame Informationen darüber, wie Klassen erben und so weiter.

Aktualisierung:

Sie sagen mir immer noch offensichtliche Dinge. Vielleicht war meine Frage wenig irreführend, aber ich werde versuchen, sie umzuformulieren:

  • Wenn wir Methode mit super aufrufen, sagen Sie, wir greifen auf die Methode des Elternteils zu. Aber wie können wir diese Methode ohne das Objekt der Eltern benennen?
  • Ist super gleich wie this ? this ist eine Referenz auf ein konkretes Objekt, wie Sie wissen.
lies 12.03.2013, 16:45
quelle

6 Antworten

5

Die untergeordnete Klasse verwaltet kein spezielles Feld, das das übergeordnete Element darstellt. Vielleicht denken Sie etwas in Richtung innerer Klassen, die tun einen Verweis auf ihre äußere Klasse beibehalten. Dies ist ein Spezialfall und repräsentiert nicht, wie Super-Sub-Klassen miteinander in Beziehung stehen.

Intern unterhält die JVM eine "Methodentabelle", die jede Klasse mit den für diese Klasse verfügbaren Methoden verknüpft. Die JVM kennt auch die Beziehungen zwischen allen geladenen Klassen, einschließlich Super-Sub-Beziehungen.

Wenn Sie eine super -Funktion aufrufen, macht die JVM tatsächlich ein paar Dinge:

  • Bestimmt das übergeordnete Element der Klasse, von der die Methode aufgerufen wird
  • Bestimmt die Methode für das übergeordnete Element, das
  • aufgerufen wird
  • Ruft die Methode mit einer speziellen Anweisung ( invokespecial )
  • auf

Wenn Sie die Klassendatei für Ihre Klasse Sub untersuchen würden, würden Sie für die Methode foo Folgendes sehen:

%Vor%

Zeile 1 in der Liste zeigt die spezielle Anweisung, die die Superklassenmethode aufruft.

Eine gute Quelle zum Lesen wäre die Java Virtual Machine-Spezifikation , besonders Abschnitt 2.11.8 .

    
Perception 12.03.2013, 17:09
quelle
3

Okay. Lass uns Zeile für Zeile durch deinen Code gehen.

Ihre erste Aussage in Ihrer 'foo' Methode ist

%Vor%

Nun, das ist ein expliziter Aufruf der Superklasse foo method. Was ist:

%Vor%

So wird "Super" an die Konsole ausgegeben, weil Sie diese Methode explizit mit dem Schlüsselwort super aufgerufen haben. super bezieht sich auf die Superklasse der Klasse, genauso wie this sich auf die aktuelle Klasse bezieht.

Weiter ist der Rest der Methode foo in der Unterklasse:

%Vor%

Nun, nachdem super.foo() aufgerufen wurde, ist es Zeit, zur nächsten Anweisung zu gehen, die "Sub" ausgibt.

Der Grund, warum Ihr Programm zuerst in die Methode der Unterklasse anstatt in die Oberklasse übergeht, liegt an dem Prinzip Polymorphism . Das heißt, eine Unterklasse übernimmt eine Methode aus der Oberklasse und ändert ihr Verhalten.

Abstrakte Klassen

Sie können keine Instanzen von abstrakten Klassen erstellen, nein, aber mit dem Schlüsselwort super können Sie dennoch auf die Funktionen der Superklasse zugreifen.

Im Kontext der Java Virtual Machine

Was passiert also, wenn die Java Virtual Machine bei einem Methodenaufruf nach der Methode in der lokalen Klasse sucht, wenn es sich um eine Instanzmethode handelt. Wenn es nicht gefunden werden kann, wird es in die Oberklasse verschoben. Wenn Sie das Prinzip Polymorphism verwenden, findet die JVM die Methode mit der korrekten Signatur in der Unterklasse und hört auf zu suchen. So funktioniert Vererbung und Polymorphism im Kontext von Java in einfachen Worten.

Wenn Sie eine Methode überschreiben, fügen Sie der Unterklassendefinition eine Methode mit derselben Methodensignatur (Name, Nummer und Typ der Felder einer Methode) hinzu. So findet die JVM das, und hier wird die überschriebene Methode gespeichert.

    
christopher 12.03.2013 16:49
quelle
3

super ist ein Schlüsselwort, mit dem Sie die in der Oberklasse definierte Methodenimplementierung aufrufen können. Es ist kein Feld Ihrer Unterklasse.

  

Wenn dies nicht der Fall ist, wo ist die überarbeitete Methode zu halten?

Ich bin nicht ganz sicher, was Sie damit meinen, aber:

  • Die Methode, die "Super" ausgibt, wird in der Klassendefinition der Oberklasse
  • gehalten
  • Die Methode, die "Sub" ausgibt, wird in der Klassendefinition der Unterklasse gehalten.

Da Sub erweitert Super ist, enthält die Definition der Klasse Sub einen Verweis auf die Definition der Klasse Super .

Beantworten aktualisierter Fragen:

  

Wenn wir Methode mit Super aufrufen, sagen Sie, dass wir die Methode der Eltern anwenden. Aber wie können wir diese Methode ohne Elternobjekt nennen?

Eine Methode ist nur ein Block von Code, nur eine Folge von Bytecode-Anweisungen, die wir ausführen müssen. Wenn Sie eine Methode aufrufen, besteht die Aufgabe der JVM darin, anhand des angegebenen Methodennamens und der Parameter festzustellen, wo dieser Codeblock zu finden ist. Normalerweise wird, wie andere bereits gesagt haben, zuerst in der Klassendefinition der Klasse des Objekts gesucht, auf dem die Methode aufgerufen wurde. Wenn Sie super verwenden, weisen Sie die JVM an, nicht hier zu suchen und stattdessen in die Definition der Elternklasse zu schauen.

Sie brauchen also keine separaten Instanzen von Super und Sub , weil ein Sub ist ein Super ( new Sub() instanceof Super ist true ), und weil der JVM weiß, dass das Schlüsselwort super bedeutet, dass es nach dem Code suchen soll, der eine Methode in der Klassendefinition von Super erstellt.

  

Ist das super gleich? Dies ist ein Verweis auf konkrete Objekte, wie Sie wissen.

Nein, sie sind nicht gleich. this ist ein Verweis auf das aktuelle Objekt, während super kein Verweis auf ein Objekt ist, sondern ein Schlüsselwort, das beeinflusst, wo die JVM nach dem Code sucht, der eine Methode definiert, die aufgerufen wird.

    
OpenSauce 12.03.2013 16:49
quelle
1

Wenn Sie super.foo(); schreiben, rufen Sie die Superklassenmethode auf.

Die foo-Methode von class sub überschreibt die foo-Methode von Super, indem eine Anweisung zur super-class-Methode hinzugefügt wird.

    
restricteur 12.03.2013 16:49
quelle
1

foo Methodenüberschreibung in der Unterklasse .super.foo () Aufruf von print super und dann System.out.println ("Sub"); zeigt Sub.

versuche dies für die Vererbung

%Vor%     
Biswajit 12.03.2013 16:50
quelle
0

Es gibt nur ein Objekt, das gleichzeitig ein Sub, ein Super und ein Objekt ist. Es enthält alle nicht statischen Felder für jede dieser Klassen. Eine Klasse benötigt nur eine Kopie des Codes für ihre Methoden, selbst die nicht-statischen.

    
Patricia Shanahan 12.03.2013 16:52
quelle

Tags und Links