Overriding Polymorphismus



  • Man sagt ja immer dass overriding Runtime Polymorphismus ist. Aber hier in diesem Beispiel koennte das ja auch der Compiler machen. Hm...

    class Bike{  
      void run(){System.out.println("running");}  
    }  
    class Splender extends Bike{  
      void run(){System.out.println("running safely with 60km");}  
    
      public static void main(String args[]){  
        Bike b = new Splender();//upcasting 
        b.run();  
      }  
    }
    
    // Ausgabe: running safely with 60km
    


  • Noch so ein Beispiel das ich nicht versteh, warum der Compiler das nicht selbst bestimmen kann. Hm...

    class Animal{  
     void eat(){System.out.println("animal is eating...");}  
    }  
    
    class Dog extends Animal{  
     void eat(){System.out.println("dog is eating...");}  
    
     public static void main(String args[]){  
      Animal a=new Dog();  
      a.eat();  
     }  
    }
    

    Output:dog is eating...

    In the above example object type cannot be determined by the compiler,
    because the instance of Dog is also an instance of Animal.
    So compiler doesn't know its type, only its base type.



  • Ich denke in diesen einfachen Beispielen kann das der Compiler tatsaechlich (oder koennte, ich weiss nicht ob Java Compiler dies optimieren). Aber in komplexeren Faellen kann er es bestimmt nicht.



  • Wo ist jetzt dein Problem? Was ist die Frage? Was ist falsch? 😕



  • die Frage. Wieso kann man Polymorphismus im Fall von Override nicht zur Compile Zeit loesen...



  • computernerds schrieb:

    Wieso kann man Polymorphismus im Fall von Override nicht zur Compile Zeit loesen...

    Ich stehe auf dem Schlauch. Was soll lösen heißen? Was willst du erreichen? Das Programm verhält sich zur Laufzeit wie erwartet. Das sind wir uns einig?

    Was wäre deine Erwartung/Ergebnis zur Compile-Zeit? Ich weiß nicht was du beim Compile machen willst?



  • du verstehst es genauso wenig wie ich 🙂 Die Behauptung dass man Polymorphismus erst zur Runtime aufloesen kann ( also welche Methode z.B. aufgerufen muss ) stammt aus diversen Buechern etc.



  • dass man Polymorphismus erst zur Runtime aufloesen kann ( also welche Methode z.B. aufgerufen muss )

    Ehm, genau das ist der Sinn des Ganzen! Warum willst du das anders haben? 😕



  • ok. Stimmt eigentlich 🙂

    Aber in dem Buch das unten aufgefuehrtes Beispiel zeigt, da wird doch tatsaechlich behauptet, dass man das nicht auch im Compiler schon bestimmt koennte. Da bin ich anderer Meinung. Aber klar es wird halt waehrend der Runtime gemacht. Aber in diesem Beispiel koennte es doch auch der Compiler machen oder nicht ?

    class Animal{   
     void eat(){System.out.println("animal is eating...");}   
    }   
    
    class Dog extends Animal{   
     void eat(){System.out.println("dog is eating...");}   
    
     public static void main(String args[]){   
      Animal a=new Dog();   
      a.eat();   
     }   
    }
    


  • Ich bin nicht ganz sicher, glaube aber einen Fall zu haben, warum selbst bei dem einfachen Beispiel Runtime Polymorphism nötig sein kann:

    Der Compiler generiert unabhängig von der Anzahl der Quellcodedateien eine Bytecode-Datei pro Klasse. Aus dem Beispiel kommt also eine Animal.class und eine Dog.class. Wenn ich jetzt eine neue Dog.class baue und die alte ersetze, sollte es mit Runtime Polymorphism weiterhin funktionieren. Hätte der Compiler den Aufruf bereits aufgelöst könnte es da Probleme geben.

    Wenn ich mir die Struktur der Classfiles (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) so angucke, würde das Ersetzen vermutlich nicht mehr klappen, sobald sich der Index der gesuchten Methode verändert.



  • computernerds schrieb:

    Da bin ich anderer Meinung. Aber klar es wird halt waehrend der Runtime gemacht. Aber in diesem Beispiel koennte es doch auch der Compiler machen oder nicht ?

    Ja, aber in Java hat man sich bewusst dazu entschieden Optimierungen in die VM zu verlagern.


Anmelden zum Antworten