Statische Java -Bindung und dynamische Bindung
Kürzlich habe ich Java -Wissen gelernt und die statische und dynamische Bindung von Java gelernt. Dann habe ich das entsprechende Wissen über Baidu zusammengefasst und sortiert, um diesen Teil des Wissens zu beherrschen.
Das Konzept der Programmbindung:
Die Bindung bezieht sich auf die Assoziation eines Methodenaufrufs mit der Klasse (der Methodenkörper), in der sich die Methode befindet. Für Java wird die Bindung in statische Bindung und dynamische Bindung unterteilt; oder es wird als frühes Bindung und verspätete Bindung bezeichnet.
Statische Bindung:
Die Methode ist gebunden, bevor das Programm ausgeführt wird (dh Sie wissen bereits, welche Klasse die Methode im Kompilierungsprozess ist) und wird vom Compiler oder anderen Verbindungsprogrammen implementiert. Zum Beispiel: C.
Es kann einfach als Bindung während der Programmkompilierungsperiode für Java verstanden werden. Hier ist besonders klar, dass die einzigen Methoden in Java endgültige, statische, private und Konstrukteure sind, die vorbinden
Dynamische Bindung:
Spätere Bindung: Bindet nach dem Typ des spezifischen Objekts zur Laufzeit.
Wenn eine Sprache eine verspätete Bindung implementiert, muss sie auch einige Mechanismen bereitstellen, um den Typ des Objekts während des Betriebs zu bestimmen und geeignete Methoden separat aufzurufen. Mit anderen Worten, der Compiler kennt den Objekttyp zu diesem Zeitpunkt immer noch nicht, aber der Mechanismus zum Aufruf von Methoden kann ihn selbst untersuchen und die richtige Methodenkörper finden. Unterschiedliche Sprachen haben unterschiedliche Möglichkeiten, eine verspätete Bindung zu implementieren. Aber wir können zumindest so denken: Sie alle müssen bestimmte spezielle Arten von Informationen im Objekt installieren.
Dynamischer Bindungsprozess:
Finale, statische, private und Konstrukteure sind das Verständnis der frühen Bindung
Für die private Methode kann sie zunächst nicht vererbt werden. Da es nicht vererbt werden kann, gibt es keine Möglichkeit, es durch das Objekt seiner Unterklasse zu rufen, kann aber nur durch das Objekt dieser Klasse selbst aufgerufen werden. Daher kann gesagt werden, 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 werden (überschrieben). Obwohl das Objekt der untergeordneten Klassen aufgerufen werden kann, wird die endgültige Methode in der übergeordneten Klasse aufgerufen (daraus können wir wissen, dass die Methode als endgültiger Typ deklariert wird, um zu verhindern, dass die Methode überschrieben wird, und die andere ist die effektive dynamische Bindung in Java).
Konstruktoren können nicht vererbt werden (es heißt auch, dass Unterklassen bedingungslos den parameterlosen Konstruktor der Elternklasse als Konstruktor erben, aber ich persönlich denke, dass diese Aussage unangemessen ist, da wir wissen, dass Unterklassen die parameterfreie Konstruktorin der Elternklasse aufrufen, um die Parameter -Konstruktorin des über Super () zu vervollständigen, um die Initialisierung der übergeordneten Klasse zu vervollständigen. der Konstruktor der Elternklasse). Daher können Sie auch wissen, zu welcher Klasse dieser Konstruktor beim Kompilieren gehört.
Ich kann die spezifischen Prinzipien der statischen Methode nicht gut erklären. Aufgrund der Online -Informationen und meines eigenen Experiments können wir jedoch daraus schließen, dass die statische Methode durch Unterklassen vererbt werden kann, aber nicht durch Unterklassen umgeschrieben (überschrieben) umgeschrieben werden kann, kann jedoch durch Unterklassen versteckt werden. (Dies bedeutet, dass bei einer statischen Methode in der übergeordneten Klasse und in ihrer Unterklasse keine entsprechende Methode vorhanden ist, dann wird die Methode in der übergeordneten Klasse verwendet, wenn das Objekt der untergeordneten Klasse diese Methode aufruft. Wenn dieselbe Methode in der untergeordneten Klasse definiert wird, wird das in der untergeordnete Klassenobjekt verwandelte Methode. Die unteren Klassenobjekte, in der die statische Methode eingetragen wird, wird in der einheitlichen Klassen -Objekt. Die statische Methode wird die statische Methode. Die statische Methode wird das statische. Die statische Methode. Die statische Methode. Die statische Methode wird in der statischen Methode. Das statische Objekt. Wenn Sie das statische Objekt in der statischen Methode in der statischen Methode in der statischen Methode verwandt, wird das statische. Die Elternklasse unabhängig davon, ob die untergeordnete Klasse diese statische Methode hat.
Aus dem oben genannten können wir daraus schließen, dass diese Methode, wenn eine Methode nicht vererbt werden kann oder nicht nach der Vererbung überschrieben werden kann, eine statische Bindung annimmt.
Zusammenstellung und Betrieb von Java
Der Java -Kompilierungsprozess ist der Prozess des Kompilierens der Java -Quelldatei in Bytecode (JVM -ausführbarer Code, d. H. Class -Datei). In diesem Prozess befasst sich Java nicht mit dem Speicher. In diesem Prozess führt der Compiler eine Syntaxanalyse durch. Wenn die Syntax falsch ist, wird ein Fehler gemeldet.
Java -Auslaufprozess bezieht sich auf JVM (Java Virtual Machine) Laden von Bytecode -Dateien und die Interpretation der Ausführung. In diesem Prozess ist es die wirkliche Erstellung von Speicherlayout und Ausführung von Java -Programmen.
Es gibt zwei Möglichkeiten, Java -Bytecode auszuführen: (1) Instant -Kompilierungsmethode: Der Interpreter kompilt zuerst die Bytes in den Maschinencode und führt dann den Maschinencode aus. . (Hier können wir sehen, dass das Java -Programm während des Ausführungsprozesses tatsächlich zwei Konvertierungen unterzogen, zuerst in Bytecode konvertiert und dann in den Maschinencode konvertiert wird. Dies ist auch der Grund, warum Java zusammengestellt und überall auf einmal ausgeführt werden kann. Installieren der entsprechenden java -virtuellen Maschinen auf verschiedenen Plattformen können dieselben Bytecode in Maschinencodes auf unterschiedlichen Plattformen installieren.
Wie bereits erwähnt, sind für die Methoden in Java mit Ausnahme der endgültigen, statischen, privaten und Konstruktoren, die frühe Bindungen sind, alle anderen Methoden dynamische Bindungen.
Die typische dynamische Bindung erfolgt unter der Konvertierungserklärung der übergeordneten Klasse und der untergeordneten Klasse:
Zum Beispiel: Eltern p = neue Kinder ();
Die spezifischen Prozessdetails sind wie folgt:
1: Der Compiler überprüft den Deklarationstyp und den Methodennamen des Objekts.
Nehmen wir an, wir nennen die XF (Args) -Methode und X wurde als Objekt der Klasse C deklariert, dann listet der Compiler alle Methoden, die F in den Methoden der Klasse C und F aus der Superklasse der Klasse C geerbt wurden, aufgeführt.
2: Als nächstes prüft der Compiler den im Methodenaufruf angegebenen Parametertyp.
Wenn ein Parametertyp unter allen Methoden mit dem Namen F mit dem vom Aufruf am meisten bereitgestellten Parametertyp übereinstimmt, wird diese Methode aufgerufen. Dieser Prozess wird als "Überlastauflösung" bezeichnet.
3: Wenn das Programm dynamische Bindung an Aufrufmethoden ausführt und verwendet, muss die virtuelle Maschine eine Methodenversion aufrufen, die dem tatsächlichen Typ des Objekts übereinstimmt, auf das nach x angezeigt wird.
Angenommen, der tatsächliche Typ ist D (eine Unterklasse von C), wenn die Klasse D f (Zeichenfolge) definiert, wird die Methode aufgerufen, andernfalls wird die Methode F (String) in der Superklasse von D usw. gesucht.
Wenn eine java -virtuelle Maschine eine Klassenmethode (statische Methode) aufruft, wählt sie die aufgerufene Methode basierend auf dem Typ der Objektreferenz (normalerweise zum Kompilierzeit) aus. Im Gegenteil, wenn eine virtuelle Maschine eine Instanzmethode aufruft, wird die aufgerufene Methode basierend auf dem tatsächlichen Typ des Objekts (nur zur Laufzeit bekannt) ausgewählt. Dies ist eine dynamische Bindung, eine Art Polymorphismus. Die dynamische Bindung bietet eine große Flexibilität, um tatsächliche Geschäftsprobleme zu lösen, und ist ein sehr schöner Mechanismus.
Im Gegensatz zu Methoden ist es beim Umgang mit Mitgliedsvariablen (Instanzvariablen und Klassenvariablen) in Java -Klassen keine Laufzeitbindung, sondern statische Bindung im allgemeinen Sinne. Bei der Aufwärtstransformation kann die Methode des Objekts die Unterklasse finden, während das Attribut des Objekts (Mitgliedsvariable) immer noch das Attribut der übergeordneten Klasse ist (das Versteck der Subklasse vor der Element -Klassen -Mitgliedsvariable).
öffentliche Klasse Vater {Protected String name = "Vater Attribut"; } Public Class Son erweitert Vater {Protected String name = "Son -Attribut"; public static void main (String [] args) {vaters sample = new Son (); System.out.println ("als Eigenschaft bezeichnet:" + sample.name); }} Schlussfolgerung: Der Anrufer ist das Attribut des Vaters.
Dieses Ergebnis zeigt, dass das Objekt der untergeordneten Klasse (das Referenzhandel der übergeordneten Klasse) zur Variablen der Elternklassenmitgliedsvariable aufgerufen wird. Daher muss klar sein, dass die von der Laufzeit (dynamische) Bindung gezielte Kategorie nur die Methode eines Objekts ist.
Wenn Sie nun versuchen, den Namen des Unterklassenmitglieds zu nennen, wie geht es das? Der einfachste Weg ist es, die Mitgliedsvariable in eine Methode Getter -Form zu integrieren.
Der Code ist wie folgt:
öffentliche Klasse Vater {Protected String name = "Vater Attribut"; public String getName () {return name; }} public class Sohn erweitert Vater {protected String name = "Son -Attribut"; public String getName () {return name; } public static void main (String [] args) {father sample = new Son (); System.out.println ("als Eigenschaft bezeichnet:" + sample.getName ()); }} Ergebnis: Das Attribut des Sohnes heißt
Warum übernehmen Java statische Bindungsmethoden für Attribute? Dies liegt daran, dass die statische Bindung viele Vorteile hat, was es uns ermöglicht, während der Zusammenstellungsphase Fehler im Programm zu entdecken, und nicht während der Laufzeitzeit. Dies verbessert die Betriebseffizienz des Programms! Die dynamische Bindung von Methoden besteht darin, den Polymorphismus zu implementieren, was ein Hauptmerkmal von Java ist. Der Polymorphismus ist auch eines der wichtigsten technologischen technologienorientierten Objekte. Daher lohnt es sich, dass Java Polymorphismus auf Kosten der Effizienz implementiert.
Hinweis: Der größte Teil des oben genannten Inhalts stammt aus dem Internet, und ein kleiner Teil ist eine persönliche Meinung und keineswegs maßgebliche Bemerkungen. Wenn es eine unangemessene Sprache oder einen falschen Ausdruck gibt, hoffe ich, Ihnen Ratschläge zu geben.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!