Statische/Dynamische Bindung
🚧 | Diese Seite befindet sich in Bearbeitung | 🚧 |
Statische und dynamische Bindung gehören zu den Eigenschaften die Vererbung in Java hervorruft. Beim Arbeiten mit Vererbung in einem Projekt gilt es also insbesondere auch auf diese Phänomene zu achten.
Dynamische Bindung
Nehmen wir folgenden Schnipsel als Beispiel:
Animal myAnimal = new Dog();
myAnimal.show();
Die Variable links ist vom Typ Animal, das Objekt rechts ist allerdings vom Typ Dog.
Diese Konstellation ist so lange erlaubt, wie links eine Elternklasse oder die Klasse selbst steht. Diese Art von Verhalten in Java Code nennen wir auch "Polymorphieverhalten".
Besitzen in dieser Konstellation beide Klassen dieselbe Methode, so wird die Version der Dog-Klasse verwendet.
Im Beispiel oben ist das die show()-Methode. Obwohl der Typ ver Variable Animal ist, wird die Methode der Klasse Dog verwendet. Warum?
Der Typ des Objektes, das der Variable zugewiesen wird, bestimmt die Methode die aufgerufen wird. In diesem Fall also die show()-Methode der Dog-Klasse.
Wenn der Compiler also folgende Zeile sieht myAnimal.show();
weiß dieser, dass myAnimal vom Typ Animal ist. Der Compiler weiß allerdings auch, dass myAnimal eine Referenz zu jeder anderen Klasse sein kann, die von dieser erbt. Es ist also für den Compiler nicht eindeutig, welche Version der show()-Methode verwendet werden soll.
Erst zur Zuweisung Animal myAnimal = new Dog();
wird die auszuführende Version festgelegt.
Weil diese Zuweisung allerdings erst zur Laufzeit stattfindet, ist auch erst dann klar, welche Version der Methode aufgerufen werden soll.
Genau dieses Phänomen nennen wir "dynamic binding" oder auch "late binding".
-> Erst wenn das Programm eine Operation in der Laufzeit ausführt kann die korrekte Version einer Methode zugewiesen werden.
Die meißten Verwendungen von Vererbung enthalten diese Art von dynamic Binding in irgendeiner Form.
Statische Bindung
Die andere Art der Bindung nennen wir "static binding" oder auch "early binding". Im Gegensatz zur dynamischen Bindung kann der Compiler die richtige Version einer Methode direkt während der Kompilierzeit, also noch vor der Laufzeit, bestimmen. "Member variables", also Attribute, werden immer statisch gebunden. Java erlaubt kein Polymorphieverhalten mit Attributen. Das bedeuted, dass sowohl die Animal- als auch die Dog-Klasse ein Attribut mit selbem Namen haben. Hierbei wird das Attribut als Richtwert genommen, das in der Elternklasse ist (in dem Fall die oberste der gesamten Hierarchie).
Wenn wir jetzt folgendes Beispiel anschauen:
Animal myAnimal = new Dog();
String sttr = myAnimal.type;
ist der Wert von "type" dem Compiler direkt klar. Da Polymorphieverhalten für Attribute verboten ist, bezieht sich das Statement auf den Wert von "type" in der Animal-Klasse, also nicht der Dog-Klasse. Hier ist also der Typ der Variable der, nach dem sich der Compiler richtet und nicht der Typ des zugewiesenen Objekts. Das Phänomen, dass der Compiler etwas während der Kompilierzeit zuweisen kann, nennen wir dann wie schon eingeführt "static binding".