Späte Bindung in Java

8

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%     
user3163829 13.03.2014, 22:01
quelle

5 Antworten

6

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>     

Ernest Friedman-Hill 13.03.2014 22:09
quelle
2

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:

Sotirios Delimanolis 13.03.2014 22:04
quelle
1

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:

%Vor%

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.

    
programmerravi 22.09.2017 20:24
quelle
0

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 .

    
Ashish 14.03.2014 06:24
quelle
0

Wenn Sie eine Methode für ein beliebiges Objekt aufrufen, denken Sie immer daran, dass in der Vererbung die "am wenigsten modifizierte Version" der Methode aufgerufen wird. Dies ist nichts anderes, als die Methodenversion dynamisch aus der Hierarchie auszuwählen.

    
bk01 14.09.2016 15:08
quelle

Tags und Links