Ich habe alle ähnlichen Fragen zur späten Bindung beim Stack-Überlauf durchsucht, und ich würde streng mit niemandem übereinstimmen, der diese Frage als Duplikat markiert. Als erstes habe ich dieses Beispiel in einer anderen Frage gefunden, aber ich verstehe nicht, wie ich wissen soll, wann etwas während der Kompilierungszeit entschieden wird und wann während der Laufzeit etwas entschieden wird. Im Grunde läuft der Kern meiner Frage auf zwei Dinge hinaus:
Was in diesem Beispiel muss bringt mich zur logischen Schlussfolgerung, dass eine Methode eine späte Bindung und eine andere eine frühe Bindung ist
Woher weiß ich, wann die Entscheidung über die Version einer auszuführenden Methode während der Laufzeit oder der Kompilierzeit in Java getroffen wird?
Code:
%Vor%Falsch in allen Punkten. Die aufzurufende Methode wird zur Laufzeit festgelegt, in jedem Fall hier basierend auf dem Laufzeittyp des Objekts. Die einzigen Entscheidungen, die während der Kompilierung getroffen werden, sind Aufrufe an finale, private oder statische Methoden oder Auswahlmöglichkeiten zwischen einer Gruppe überladener Methoden (die immer noch zu Laufzeitoptionen führen können, wenn die überladenen Methoden nicht endgültig, privat oder statisch sind) / p>
Java verwendet die späte Bindung für alle nicht endgültigen, nicht privaten Instanzmethoden. So wird Polymorphie implementiert. Alle Anrufe, die Sie kommentiert haben, werden zur Laufzeit festgelegt.
In
%Vor% a
verweist auf ein Objekt A
, so dass die Implementierung von A
gefunden, gebunden und verwendet wird.
In
%Vor% b
verweist auf ein B
-Objekt, damit die Implementierung von B
gefunden, gebunden und verwendet wird.
In
%Vor% ref
verweist auf ein B
-Objekt, damit die Implementierung von B
gefunden, gebunden und verwendet wird.
Der statische (deklarierte) Typ der Variablen wird nur vom Compiler verwendet, um zu verifizieren, dass eine solche Methode auf diesen Typ zugreifbar ist.
Verwandte:
Alle Antworten hier sind größtenteils korrekt, aber es fehlt ein wichtiger Punkt bezüglich der späten Bindung in Java.
Java führt keine "nach dem Buch" späte Bindung durch, wenn wir die Definition der späten Bindung verwenden.
Late Binding in seiner Buchdefinitionsform bedeutet, dass der Compiler bei einem Methodenaufruf keine Argumentprüfungen, keine Typprüfungen durchführen sollte und alles der Laufzeit überlassen sollte - weil möglicherweise der Compiler keinen Zugriff auf den Methodenimplementierungscode hat (zB in COM-Programmierung).
Java überprüft jedoch zur Kompilierzeit selbst in einem polymorphen Szenario, dass die aufgerufene Methode und die Methodensignatur irgendwo in der Typhierarchie des Ausdrucks existieren, der die Methode qualifiziert. Nehmen wir zum Beispiel an, ich rufe eine Methode foo1 für ref auf, die weder in A noch in B existiert:
In einem reinen späten Bindungsszenario wird die Bestimmung, ob die Methode foo1 () mit der richtigen Anzahl von Argumenten existiert oder nicht, nur zur Laufzeit gemacht.
In Java wird jedoch zum Zeitpunkt der Kompilierung eine gewisse Überprüfung durchgeführt, um sicherzustellen, dass die Methode mit der richtigen Anzahl von Argumenten irgendwo in der Typhierarchie existiert.
Die einzige Zeit, zu der ich glaube, dass Java pure späte Bindung durchführt, ist, wenn man Reflektion verwendet, um eine Methode aufzurufen.
Was Java tut, wird besser als dynamischer Dispatch und nicht als späte Bindung bezeichnet, aber jeder nennt es späte Bindung in Java und daher gibt es Verwirrung.
Betrachten Sie die Aussage
%Vor% Hier ist ref eine Referenz von class A
und sie hat die Adresse des Objekts von class B
f2 () ist eine overridden
Methode.
Wenn der Compiler eine solche Anweisung erkennt, bindet er den Funktionsaufruf nicht an irgendeine Definition. Es validiert nur den Anruf.
Die Bindung solcher Aufrufe bleibt für die Laufzeitumgebung bestehen. Zur Programmlaufzeit identifiziert das System den Datentyp des Objekts und bindet den Funktionsaufruf mit der von der Objektklasse bereitgestellten Funktionsdefinition. Diese Art der Bindung zwischen Funktionsaufruf und Funktionsdefinition wird als "späte Bindung" oder "Laufzeitbindung" oder "Laufzeitpolymorphismus" oder als "dynamischer Methodenversand" gehen Sie durch diese Frage und lies meine Antwort Beispiel ist auch dort gegeben .
Tags und Links java late-binding