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:
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
würde ich klar sagen es ist eine dynamische Bindung.
Aber bei
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
alle statisch gebunden?
Und nur
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?!
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);
Aber bei
Java:
B b = new B();
println(b.s);
Also wären
Java:
A a = new A();
B b = new B();
println(a.s);
println(b.s);
println(t.s);
println(t.s);
Und nur
Java:
A a = new B();
println(a.s);
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?!