Ich hab grad ein Beispiel für dynamische Bindung erstellt:
Java:
publicclassAuto{Publicvoidichbin(){System.out.println(„Ich bin ein Auto“);}}publicclassMercedesextendsAuto{publicvoidichbin(){System.out.println(„Ich bin ein Mercedes“);}publicclass BMW extendsAuto{publicvoidichbin(){System.out.println(„Ich bin ein BMW“);}importjava.util.List;publicclassTest{privateList<Auto>Lol=newArrayList<Auto>();publicvoidausgeben(){Auto a =newAuto();Mercedes b =newMercedes();BMW c =newBMW();Lol.add(a);Lol.add(b);Lol.add(c);for(Auto e : lol ){System.out.println(e.ichbin());...
Ausgabe:
Ich bin ein Auto
Ich bin ein Mercedes;
Ich bin ein BMW
Ich weiß jetzt nicht genau, wie man ein Beispiel für statische Bindung schreiben könnte bzw versteh ich auch nicht ganz genau, wie das als code aussehen würde.
wenn ich z.B: mit super.ichbin(); aufrufen würde, wäre das ja immer noch dynamisch
kann mir jemand ein gutes Beispiel für statische Bindung schreiben?
publicclassFoo{staticclassA{String a ="statisch";Stringget(){return a;}}staticclassBextendsA{String a ="dynamisch";@OverrideStringget(){return a;}}publicstaticvoidmain(String[] args){A a =newB();System.out.println(a.get());// dynamischSystem.out.println(a.a);// statisch}}
Java kann kein Multiple Dispatch. Man könnte das als eine Art statische Bindung auffassen, da ja keine dynamische Bindung stattfindet.
Java:
publicabstractclassShape{publicvoidintersects(Shape that){System.out.println(this.toString()+" instersects with a Shape");}publicvoidintersects(Circle circle){System.out.println(this.toString()+" instersects with a Circle");}publicvoidintersects(Triangle triangle){System.out.println(this.toString()+" instersects with a Triangle");}@OverridepublicStringtoString(){return"Shape";}}publicclassCircleextendsShape{@OverridepublicStringtoString(){return"Circle";}}publicclassTriangleextendsShape{@OverridepublicStringtoString(){return"Triangle";}}List<Shape> shapes =newArrayList<Shape>();
shapes.add(newCircle());
shapes.add(newTriangle());for(Shape s1 : shapes){for(Shape s2: shapes){
s1.intersects(s2);}}
Ausgabe:
Code:
Circle instersects with a Shape
Circle instersects with a Shape
Triangle instersects with a Shape
Triangle instersects with a Shape
Es wird also immer "statisch" die erste Version von [c]intersects[/c] gebunden, obwohl man dynamisch jeweils eine "besser passende" Version hätte finden können.
Natürlich ist dieses Verhalten hier eher ungünstig. Das "erwartete" Verhalten lässt sich mit Double Dispatch erziehlen.
nur weil keine Vererbung stattfindet einen Code als Beispiel für statistische Bindung in Java zu verwenden ist etwas kühn,
dann könnte man ja auch im Auto-Beispiel ganz am Anfang die ichbin()-Methoden der Subklassen streichen, ob das akzeptiert wird?
ein derart kompilierter Code kann zur Laufzeit immer noch ausgetrickst werden wenn neue Unterklassen theoretisch erlaubt
und von außen übergeben oder zumindest per Reflection reingemogelt werden können,
eine richtig statische Bindung zur Laufzeit ist meiner Ansicht nach nur der Aufruf statischer + finaler Methoden + Variablen
----
dass zur Kompilierzeit die Signatur der Methode statisch gewählt wird statt Multiple Dispatch ist für sich gewiss interessant,
innerhalb der Java-Gegebenheiten letztlich aber nicht relevant zur aktuellen Frage, da gehts um was anderes