Statische Java-Bindung und dynamische Bindung
Das Konzept der Programmbindung:
Bindung bezieht sich auf das, was ist aufgerufen ist, dass der Aufruf einer Methode mit der Klasse (Methodenkörper) verknüpft ist, in der sich die Methode befindet. Für Java wird die Bindung in statische Bindung und dynamische Bindung unterteilt.
Statische Bindung:
Die Methode wurde bereits gebunden Das Programm wird ausgeführt (d. h. es ist bereits bekannt, in welcher Klasse die Methode während des Kompilierungsprozesses eine Methode ist), was vom Compiler oder einem anderen Linker implementiert wird. Zum Beispiel: C.
Für Java kann es einfach als Bindung während der Programmkompilierung verstanden werden. Hier ist ein besonderer Hinweis: In Java sind nur finale, statische, private und Konstruktormethoden vorgebunden
Dynamische Bindung:
Späte Bindung: Bindung basierend auf dem Typ des spezifischen Objekts zur Laufzeit.
Wenn eine Sprache eine späte Bindung implementiert, muss sie auch einen Mechanismus bereitstellen, um den Typ des Objekts während der Laufzeit zu bestimmen und entsprechende Methoden aufzurufen. Mit anderen Worten, der Compiler kennt den Typ des Objekts zu diesem Zeitpunkt noch nicht, aber der Methodenaufrufmechanismus kann selbst nachforschen und den richtigen Methodenkörper finden. Verschiedene Sprachen implementieren die späte Bindung unterschiedlich. Aber wir können es uns zumindest so vorstellen: Sie alle fügen dem Objekt eine besondere Art von Information hinzu.
Der Prozess der dynamischen Bindung:
Die virtuelle Maschine extrahiert die Methodentabelle des tatsächlichen Objekttyps ;
Die virtuelle Maschine sucht nach Methodensignatur
Ruft die Methode auf.
Über das Verständnis, dass finale, statische, private und Konstruktormethoden vorab gebunden sind
Für private Methoden gilt zunächst einmal, dass sie nicht vererbt werden können. Da es nicht vererbt werden kann, kann es nicht über das Objekt seiner Unterklasse aufgerufen werden, sondern nur über das Objekt der Klasse selbst. Daher kann man sagen, dass die private Methode an die Klasse gebunden ist, die diese Methode definiert.
Obwohl die endgültige Methode vererbt werden kann, kann sie nicht überschrieben (abgedeckt) werden. Obwohl das Unterklassenobjekt aufgerufen werden kann, wird die in der übergeordneten Klasse definierte endgültige Methode aufgerufen Die Methode wird als endgültiger Typ deklariert, um erstens zu verhindern, dass die Methode überschrieben wird, und zweitens, um die dynamische Bindung in Java effektiv zu deaktivieren.
Konstruktoren können nicht vererbt werden (im Internet heißt es auch, dass Unterklassen den parameterlosen Konstruktor der übergeordneten Klasse bedingungslos als eigenen Konstruktor erben, aber ich persönlich halte diese Aussage für nicht angemessen, da wir wissen, dass Unterklassen super() übergeben) Um den Parameterlosen Konstruktor der übergeordneten Klasse aufzurufen, um die Initialisierung der übergeordneten Klasse abzuschließen, müssen wir dies nicht tun, wenn wir von der übergeordneten Klasse geerbte Methoden verwenden. Daher sollte nicht gesagt werden, dass die Unterklasse den Konstruktor der übergeordneten Klasse erbt. Sie können beim Kompilieren auch wissen, zu welcher Klasse diese Konstruktionsmethode gehört.
Was die statische Methode betrifft, kann ich das spezifische Prinzip nicht klar erklären. Aufgrund der Informationen im Internet und meiner eigenen Experimente kann ich jedoch den Schluss ziehen, dass statische Methoden von Unterklassen geerbt werden können, sie jedoch nicht von Unterklassen überschrieben (überschrieben) werden können, sondern von Unterklassen ausgeblendet werden können. (Dies bedeutet, dass, wenn es eine statische Methode in der übergeordneten Klasse und keine entsprechende Methode in ihrer Unterklasse gibt, dann, wenn das Unterklassenobjekt diese Methode aufruft, die Methode in der übergeordneten Klasse verwendet wird. Und wenn es in definiert ist Unterklasse Dieselbe Methode ruft die in der Unterklasse definierte Methode auf. Der einzige Unterschied besteht darin, dass das Objekt bei der Umwandlung des Unterklassenobjekts in ein übergeordnetes Klassenobjekt die statische Methode in der übergeordneten Klasse verwendet, unabhängig davon, ob es in der Unterklasse definiert ist Daher wird gesagt, dass statische Methoden ausgeblendet, aber nicht überschrieben werden können. Dies ist dasselbe wie das Ausblenden und Überschreiben der Unterklasse Das übergeordnete Klassenobjekt kann auf die ausgeblendeten Variablen und Methoden der übergeordneten Klasse zugreifen, jedoch nicht auf die überschriebenen Methoden der übergeordneten Klasse.)
Aus dem Obigen können wir schließen, dass wenn a Die Methode kann nicht vererbt oder nach der Vererbung überschrieben werden. Dann verwendet diese Methode eine statische Bindung.
Kompilierung und Betrieb von Java
Der Kompilierungsprozess von Java besteht darin, Java-Quelldateien in einen Bytecode-Prozess (ausführbarer JVM-Code, d. h. .class-Datei) zu kompilieren , währenddessen verarbeitet Java nicht den Speicher. Während dieses Vorgangs analysiert der Compiler die Syntax und meldet einen Fehler, wenn die Syntax falsch ist.
Der laufende Prozess von Java bezieht sich darauf, dass die JVM (Java Virtual Machine) die Bytecode-Datei lädt und sie zur Ausführung interpretiert. Dabei wird das Speicherlayout tatsächlich erstellt und das Java-Programm ausgeführt.
Es gibt zwei Möglichkeiten, Java-Bytecode auszuführen: (1) Just-in-Time-Kompilierungsmethode: Der Interpreter kompiliert zuerst die Bytes in Maschinencode und führt dann den Maschinencode aus. (2) Interpretationsausführungsmethode: Der Interpreter übergibt Jeder interpretiert und führt jeweils einen kleinen Code aus, um alle Vorgänge des Java-Bytecode-Programms abzuschließen. (Hier können wir sehen, dass das Java-Programm während der Ausführung tatsächlich zweimal konvertiert wird, zuerst in Bytecode und dann in Maschinencode. Aus diesem Grund kann Java einmal kompiliert und überall ausgeführt werden. Auf verschiedenen Plattformen Durch die Installation der entsprechenden virtuellen Java-Maschine das Gleiche Bytecode kann auf verschiedenen Plattformen in Maschinencode umgewandelt werden, um auf verschiedenen Plattformen ausgeführt zu werden)
Wie bereits erwähnt, für die Methoden in Java, mit Ausnahme der endgültigen, statischen, privaten und Konstruktormethoden, die vorgebunden sind , alle anderen Methoden sind dynamisch gebunden.
Dynamische Bindung erfolgt typischerweise unter der Konvertierungsdeklaration der Elternklasse und Unterklasse:
Zum Beispiel: Parent p = new Children();
Die spezifischen Prozessdetails lauten wie folgt:
1: Der Compiler prüft den deklarierten Typ und Methodennamen des Objekts.
Angenommen, wir rufen die Methode x.f(args) auf und x wurde als Objekt der Klasse C deklariert. Dann listet der Compiler alle Methoden mit dem Namen f in Klasse C und alle Methoden aus Klasse C auf f-Methode, geerbt von der Superklasse.
2: Als nächstes prüft der Compiler die im Methodenaufruf bereitgestellten Parametertypen.
Wenn es unter allen Methoden mit dem Namen f einen Parametertyp gibt, der am besten mit dem vom Aufruf bereitgestellten Parametertyp übereinstimmt, wird diese Methode aufgerufen. Dieser Vorgang wird als „Überlastungsauflösung“ bezeichnet.
3: Wenn das Programm ausgeführt wird und eine Methode mithilfe der dynamischen Bindung aufgerufen wird, muss die virtuelle Maschine eine Version der Methode aufrufen, die dem tatsächlichen Typ des Objekts entspricht, auf das x zeigt.
Angenommen, der tatsächliche Typ ist D (eine Unterklasse von C), dann wird diese Methode aufgerufen die Oberklasse von D. und so weiter.
Wenn die virtuelle JAVA-Maschine eine Klassenmethode (statische Methode) aufruft, wählt sie die aufzurufende Methode basierend auf dem Typ der Objektreferenz aus (normalerweise zur Kompilierungszeit bekannt). Wenn die virtuelle Maschine dagegen eine Instanzmethode aufruft, wählt sie die aufzurufende Methode basierend auf dem tatsächlichen Typ des Objekts aus (der nur zur Laufzeit bekannt sein kann). Dies ist eine dynamische Bindung, eine Art Polymorphismus . Die dynamische Bindung bietet große Flexibilität bei der Lösung tatsächlicher Geschäftsprobleme und ist ein sehr schöner Mechanismus.
Im Gegensatz zu Methoden wird beim Umgang mit Mitgliedsvariablen (Instanzvariablen und Klassenvariablen) in Java-Klassen nicht die Laufzeitbindung verwendet, sondern eine statische Bindung im allgemeinen Sinne. Daher kann die Methode des Objekts bei einer Aufwärtstransformation die Unterklasse finden, aber die Attribute des Objekts (Mitgliedsvariablen) sind immer noch die Attribute der übergeordneten Klasse (die Unterklasse verbirgt die Mitgliedsvariablen der übergeordneten Klasse).
public class Father { protected String name = "父亲属性"; } public class Son extends Father { protected String name = "儿子属性"; public static void main(String[] args) { Father sample = new Son(); System.out.println("调用的属性:" + sample.name); } }
Fazit: Das berufene Mitglied ist das Attribut des Vaters.
Dieses Ergebnis zeigt, dass das Objekt der Unterklasse (Referenzhandle der übergeordneten Klasse) die Mitgliedsvariable der übergeordneten Klasse aufruft. Es muss also klar sein, dass der Umfang der Laufzeitbindung (dynamisch) nur die Methode des Objekts ist.
Jetzt versuchen Sie, den Mitgliedsvariablennamen der Unterklasse aufzurufen. Was sollten Sie tun? Der einfachste Weg besteht darin, die Mitgliedsvariable in eine Getter-Methode zu kapseln.
Der Code lautet wie folgt:
public class Father { protected String name = "父亲属性"; public String getName() { return name; } } public class Son extends Father { protected String name = "儿子属性"; public String getName() { return name; } public static void main(String[] args) { Father sample = new Son(); System.out.println("调用的属性:" + sample.getName()); } }
Ergebnis: Das Attribut des Sohnes heißt
Warum verwendet Java eine statische Bindungsmethode für Eigenschaften? Dies liegt daran, dass die statische Bindung viele Vorteile hat. Sie ermöglicht es uns, Fehler im Programm zur Kompilierungszeit statt zur Laufzeit zu finden. Dadurch wird die Laufeffizienz des Programms verbessert!
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispielcodes für statische Java-Bindung und dynamische Bindung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!