OOP Definition / Abgrenzung dynamische Bindung

Hey ho,

ich denke mir ist das Prinzip der dynamischen Bindung recht klar zumindest verhält sich Java exakt so wie ich es erwarte und ich kann damit arbeiten. Aber demnächst steht bei mir eine Klausur an und da geht es dann leider mehr um die Theorie und da fehlt mir so ein bisschen die "klare Abgrenzung" wann man noch von dynamisch spricht und wann von statisch. Und leider ist das eine gern gesehene Aufgabe da man das schön auf dem Papier lösen kann. Der Code ist gegeben und beurteilt muss werden ob dynamisch oder statische Bindung vorliegt.

Um das ganze weniger abstrakt zu machen vielleicht an Hand eines einfachen Beispiels:
Java:
class A {

    protected String s = "A:s";
    protected String t = "A:t";
    public String s() {
        return s;
    }
    public String t() {
        return t;
    }

}

class B extends A {

    protected String s = "B:s";
    protected String t = "B:t";

    public String s() {
        return s;
    }
}

public class PolyTest {

    public static void main(String[] args) {

        B b = new  B();
        A a = b;
        System.out.println( b.s() ); // statisch?
        System.out.println( a.s() ); // dynamisch?
        System.out.println( b.t() ); // statisch?
        System.out.println( a.t() ); // statisch?
   
    }
}

Was wieso ausgegeben wird ist mir absolut klar. Aber wo ich mir nicht ganz sicher bin ist bei folgenden Fällen die formelle Definition:

Bei
Java:
A a = new B();
println(a.s);
würde ich klar sagen es ist eine dynamische Bindung.

Aber bei
Java:
B b = new B();
println(b.s);
ist ja im Grunde schon durch die Deklaration die Methode klar da schon beim kompilieren zur gleichen Methode aufgelöst werden müsste wie zur Laufzeit. Dennoch bestimmt ja am Ende schon "new B();" über den VMT welche Methode aufgerufen wird (auch wenn es dann schon auf die richtige zeigt) und "new B();" ist ja vom dynamischen Typ. Ich würde jetzt ansich sagen es ist eine statische Bindung aber da new B() ja immer dynamisch ist weiss ich nicht wie man das formell benennt. Also spricht man allgemein immer von einer dynamischen Bindung bei Objektmethoden oder nur wenn tatsächlich eine Methode überschrieben wurde + die Variable den Typ des Vorfahrens der Klasse hat? Also tatsächlich dynamisch die Methode zur Laufzeit gegenüber der vom Compiler geändert wurde?

Also wären
Java:
A a = new A();
B b = new B();
println(a.s);
println(b.s);
println(t.s);
println(t.s);
alle statisch gebunden?

Und nur
Java:
A a = new B();
println(a.s);
dynamisch?

Vielleicht kann mir ja jemand helfen wie man das so definiert. Unser Script sagt leider nur:
"Bei Variablen statische Bindung, bei Methoden dynamisch! Zur Compilezeit nur der Statische Typ sicher, daher auch die entsprechende Variablen benutzt. Auch die Signatur einer Methode steht dann fest"
..wenig hilfreich.. es sei denn es ist wirklich allgemein so, dass man bei Methoden dann immer von einer dynamischen Bindung ausgeht was ich mir so aber nicht vorstellen kann?!
 

mrBrown

Super-Moderator
Mitarbeiter
Vielleicht kann mir ja jemand helfen wie man das so definiert. Unser Script sagt leider nur:
"Bei Variablen statische Bindung, bei Methoden dynamisch! Zur Compilezeit nur der Statische Typ sicher, daher auch die entsprechende Variablen benutzt. Auch die Signatur einer Methode steht dann fest"
..wenig hilfreich.. es sei denn es ist wirklich allgemein so, dass man bei Methoden dann immer von einer dynamischen Bindung ausgeht was ich mir so aber nicht vorstellen kann?!
Ich würde an der Stelle auf das Skript hören ;)

Die Methoden oben sind alle dynamisch gebunden
 

Flown

Administrator
Mitarbeiter
Also Java kennt keine statische Bindung von Methoden, außer sie sind statisch oder final (bei diesem bin ich mir nicht sicher).

Somit sind aus deinem Beispiel alle Methodenaufrufe dynamisch. Bei den letzten beiden Aufrufen hast du das Problem von Shadowing du überschreibst die Objektvariable t. Richtig wäre:
Java:
class B extends A {
 
  protected String s = "B:s";
 
  public B() {
    t = "B:t";
  }
 
  public String s() {
    return s;
  }
}

EDIT: Gerade verifiziert. final Methoden werden auch mit invokevirtual aufgerufen.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Also Java kennt keine statische Bindung von Methoden, außer sie sind statisch oder final (bei diesem bin ich mir nicht sicher).
private Methoden und Konstruktoren noch ;)

EDIT: Gerade verifiziert. final Methoden werden auch mit invokevirtual aufgerufen.
Ja, die gehen nicht, weil man das final wegnehmen kann, und die Klasse trotzdem noch kompatibel ist.


Wobei das natürlich wieder anders aussieht, wenn man den Hotspot-Compiler statt javac betrachtet...
 

Flown

Administrator
Mitarbeiter
private Methoden und Konstruktoren noch ;)
Konstruktoren & private Methoden werden mit #invokespecial betrieben und auf private Methoden hat man von außerhalb so und so keinen Zugriff.
Ja, die gehen nicht, weil man das final wegnehmen kann, und die Klasse trotzdem noch kompatibel ist.
final funktioniert nicht, weil schon die finale Methode schon überschrieben sein kann und von daher braucht man das dynamisch.
 
Zuletzt bearbeitet:
Danke für die zahlreichen Antworten. Den Insel Artikel kenne ich und wie gesagt der Mechanismus als solches ist mir relativ klar. Es ist ja ansich auch deutlich einfacher wenn man einfach von dynamischer Bindung ausgeht ausser bei privaten/statischen/finalen Methoden. Aber das Problem ist irgendwie wird diese Unterscheidung nicht so wirklich konsequent so gemacht.

Z.b schreibst du Flown im Polymorphie Post von Kiimarii
Auweia das ist ein wenig ein komplexeres Thema, aber hier tritt kein einziges mal dynamic dispatching (dynamische Bindung) auf.

Aber eurer Aussage nach müssten die Methoden (wie "x.m(most);" usw ja dann auch alle dynamisch gebunden sein?!

Und in dem genannten Insel Artikel steht z.B
Das liegt daran, dass nur überschriebene Methoden an dynamischer Bindung teilnehmen, und wenn es kein Überschreiben gibt, dann gibt es auch keine dynamische Bindung.

Würde ja in meinem Beispiel eigentlich bedeuten, dass die Methode t da sie nicht überschrieben wurde nicht an dynamischer Bindung teilnimmt. Also mir ist schon klar dass die t() immer noch einer virtuelle Methode ist etc und die Auswahl der tatsächlich auszuführenden Methode zur Laufzeit anhand des zugewiesenen Objektes erfolgt was eigentlich definitionsgemäß eine dynamsiche Bindung darstellt. Aber sei es in der Literatur oder auch so von Leuten wird oft nur dann von dynamischer Bindung gesprochen, wenn auch überschrieben wurde etc.

Mit der Überschattung ist ein guter Hinweis.. da sieht man mal wie schnell sich sowas "einschleicht" ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Konstruktoren & private Methoden werden mit #invokespecial betrieben und auf private Methoden hat man von außerhalb so und so keinen Zugriff.
Was doch durchaus ein Äquivalent zum statischen Binding ist - die Methode steht schon zur Kompilezeit fest und hängt nur vom statisch Typ ab.

final funktioniert nicht, weil schon die finale Methode schon überschrieben sein kann und von daher braucht man das dynamisch.
Warum sind denn die weiter oben in der Hierarchie liegenden Methoden relevant?
Wenn sie für den statischen Typ als final deklariert ist, sollten die dabei doch die Supertypen egal sein

Oder meinen wir beide das gleiche - das ein zur Kompilezeit finaler und statisch feststehender Methodenauftuf zur Laufzeit nicht mehr final und damit ein anderer sein kann?
 

Flown

Administrator
Mitarbeiter
Oder meinen wir beide das gleiche - das ein zur Kompilezeit finaler und statisch feststehender Methodenauftuf zur Laufzeit nicht mehr final und damit ein anderer sein kann?
Im Grunde ja.
Aber das Problem ist irgendwie wird diese Unterscheidung nicht so wirklich konsequent so gemacht.
Klar wird alles durchgezogen ist auch in der JLS so spezifiziert.
Aber eurer Aussage nach müssten die Methoden (wie "x.m(most);" usw ja dann auch alle dynamisch gebunden sein?!
Die Methoden sind dynamisch gebunden, aber da der outcome nicht so wie erwartet ist, hat nichts mit dynamic dispatching zu tun. Sondern mit der Sichtbarkeit von Methoden des statischen Typs, also eine komplett andere Baustelle. Hab auch ein Beispiel dazugeschrieben, wie es dann dynamic dispatched wird.
Würde ja in meinem Beispiel eigentlich bedeuten, dass die Methode t da sie nicht überschrieben wurde nicht an dynamischer Bindung teilnimmt.
Grob gesagt, jede öffentliche Methode wird mit invokedynamic aufgerufen. Wenn jetzt keine Methode überschrieben wird, dann gibt es sozusagen keine "Auswahl" oder "Konkretisierungen" und ist im engeren Sinne keine dynamische Bindung, weil was soll ohne Auswahl denn dynamisch sein?!
 

mrBrown

Super-Moderator
Mitarbeiter
Die Methoden sind dynamisch gebunden, aber da der outcome nicht so wie erwartet ist, hat nichts mit dynamic dispatching zu tun. Sondern mit der Sichtbarkeit von Methoden des statischen Typs, also eine komplett andere Baustelle. Hab auch ein Beispiel dazugeschrieben, wie es dann dynamic dispatched wird.
In dem anderem Beispiel werden allerdings auch Methoden überschrieben, das ist schon dynamic dispatch ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
D Methoden Definition einer Methode Java Basics - Anfänger-Themen 3
M Datentypen Java Datentyp Definition Java Basics - Anfänger-Themen 6
shiroX OOP Rekursive und Iterative Definition Java Basics - Anfänger-Themen 2
S Erste Schritte Suche nach einem guten JAVA-Buch (Definition im Thread) Java Basics - Anfänger-Themen 6
S Methoden Klassen Definition - Methodenaufruf Java Basics - Anfänger-Themen 7
J definition / deklaration Java Basics - Anfänger-Themen 2
P Klassen Instanz einer Klasse in ihrer eigenen Definition erzeugen? möglich? Java Basics - Anfänger-Themen 4
D Entwurfsmuster - Frage und Definition Java Basics - Anfänger-Themen 9
H Definition von Java Mutex: ReentrantLock Java Basics - Anfänger-Themen 6
G Definition / Deklaration Java Basics - Anfänger-Themen 13
I Deklaration und Definition Java Basics - Anfänger-Themen 7
J Benötige kurze Definition zum Programm Java Basics - Anfänger-Themen 2
K Definition Java Basics - Anfänger-Themen 4
S Methoden Deklaration u. Definition trennbar (wie in C)? Java Basics - Anfänger-Themen 9
G Definition einer Array Java Basics - Anfänger-Themen 3
G Definition einer logischen Variablen Java Basics - Anfänger-Themen 4
S Generizität Definition Java Basics - Anfänger-Themen 2
ohneInformatik; Dynamische Zinsen. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
A Erste Schritte Dynamische Stempel im PDF Exchange programmieren Java Basics - Anfänger-Themen 0
B Fibonacci Zahlen dynamische Programmierung Java Basics - Anfänger-Themen 7
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
L Dynamische Bindung Java Basics - Anfänger-Themen 3
J Dynamische Datenstrukturen Java Basics - Anfänger-Themen 0
L Variablen Dynamische Variablenname Java Basics - Anfänger-Themen 9
L Dynamische Programmierung Java Basics - Anfänger-Themen 0
M Schlüsselworte Dynamische Polymorhpie Java Basics - Anfänger-Themen 32
J OOP Dynamische Objektnamen Java Basics - Anfänger-Themen 6
Ste3et_C0st Dynamische While/For Schleife Java Basics - Anfänger-Themen 7
F Erste Schritte Dynamische Variablen Java Basics - Anfänger-Themen 15
M Dynamische Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 11
S Dynamische Variable ist? Java Basics - Anfänger-Themen 11
S Verwirrung - Dynamische Bindung greift nicht Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
P Klassen statische oder dynamische(?) Klasse Java Basics - Anfänger-Themen 3
J Dynamische Liste durchsuchen + anpassen Java Basics - Anfänger-Themen 3
A Schlüsselworte dynamische Stringteilung Java Basics - Anfänger-Themen 4
C Dynamische (AJAX) Inhalte einer Webseite mittels Java auslesen Java Basics - Anfänger-Themen 2
W Übungsaufgabe:Dynamische Datenstrukturen Java Basics - Anfänger-Themen 10
B dynamische erzeugung eines Objektes Java Basics - Anfänger-Themen 21
L Dynamische Objektgenerierung Java Basics - Anfänger-Themen 4
K Dynamische Bindungsregel Java Basics - Anfänger-Themen 2
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
C dynamische JTextFields durchlaufen Java Basics - Anfänger-Themen 5
H Dynamische Bindung mit Interfaces und LinkedList Java Basics - Anfänger-Themen 7
N OOP Dynamische Objekte und nach Parametern durchsuchen Java Basics - Anfänger-Themen 4
M dynamische JPanels/Component Java Basics - Anfänger-Themen 3
X dynamische Listen Java Basics - Anfänger-Themen 2
A Schnelle, dynamische, geordnete Datenstruktur? Java Basics - Anfänger-Themen 11
M Dynamische JButtons mit ActionListener Java Basics - Anfänger-Themen 7
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
C Dynamische Matrizen Java Basics - Anfänger-Themen 4
0 Dynamische Datenstruktur ohne Duplikate und mit direkter Elementauswahl Java Basics - Anfänger-Themen 3
N Vererbung/Dynamische Bindungen Java Basics - Anfänger-Themen 15
W Dynamische Bindung Java Basics - Anfänger-Themen 3
P jsp tags und scriplets mischen dynamische werte an jsp tag Java Basics - Anfänger-Themen 2
S Dynamische Tabelle Java Basics - Anfänger-Themen 2
P Suche Ersatz für dynamische arrays Java Basics - Anfänger-Themen 2
T Dynamische Reaktionen Java Basics - Anfänger-Themen 29
P Dynamische Bindung Java Basics - Anfänger-Themen 8
F Dynamische Speicheranpassung und exe Java Basics - Anfänger-Themen 9
D Dynamische Objektnamen / Variablen als Objektnamen verwenden Java Basics - Anfänger-Themen 3
J dynamische Auswahl einer überladenen Methode Java Basics - Anfänger-Themen 5
C JTable und dynamische Speicherung Java Basics - Anfänger-Themen 2
M Dynamische Wertsetzung von Variablen durch Eingaben Java Basics - Anfänger-Themen 9
J Dynamische Größenveränderung der Komponenten verhindern Java Basics - Anfänger-Themen 8
C Dynamische Operatoren! Java Basics - Anfänger-Themen 5
R dynamische Variablennamen Java Basics - Anfänger-Themen 3
M dynamische, assziative Arrays Java Basics - Anfänger-Themen 2
I dynamische mehrdimensionales Array Java Basics - Anfänger-Themen 8
H Unterschied statischer/dynamische Typ einer Variablen Java Basics - Anfänger-Themen 2
H statische,dynamische Bindung Java Basics - Anfänger-Themen 4
0 Dynamische Speicherverwaltung Java Basics - Anfänger-Themen 4
B Dynamische If Anweisung Java Basics - Anfänger-Themen 13
B Dynamische Variable Java Basics - Anfänger-Themen 12
C Dynamische Arraygröße Java Basics - Anfänger-Themen 2
M dynamische tabellen Java Basics - Anfänger-Themen 2
G Java dynamische Arrays?? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben