2016-07-25 15 views
0

Das war eine Frage, die ich in einer Website gefunden habe. Der Code geht so.Was ist der mögliche Grund für diese Ausgabe?

public class Test { 
public static void main(String[] args) { 
    new B(); 
    } 
} 

class A { 
    int i = 7; 

    public A() { 
    setI(20); 
    System.out.println("i from A is " + i); 
    } 

    public void setI(int i) { 
    this.i = 2 * i; 
    } 
} 

class B extends A { 
    public B() { 
    // System.out.println("i from B is " + i); 
    } 

    public void setI(int i) { 
    this.i = 3 * i; 
    } 
} 

Ich mag würde wissen, warum der Ausgang dieses i von A 60 und nicht 40. Vielen Dank im Voraus =)

+1

Warum sollten Sie erwarten, dass es 40 ist? Es ist schwer, deinen Gedankengang zu korrigieren, wenn du es nicht ausdrückst. –

+0

Wenn Sie erwarten, dass es 40 ist, dann ignorieren Sie die Idee des Polymorphismus vollständig. :) –

Antwort

4

Diese einfache Polymorphismus ist.

Sie erstellen ein B-Objekt. Wenn der A-Konstruktor also setI() aufruft, ruft es die "B-Version" auf (was zu 3 * 20 = 60 führt).

Mit anderen Worten: Wenn Sie eine Methode für ein Objekt in Java aufrufen, wird die JVM versuchen Sie es zu Laufzeit von denen Beton Klasse, die das Objekt ist; und rufen Sie die Methode auf , dass Klasse findet. Also: setI() wird genau einmal in seiner "B" -Version aufgerufen.

Sie können dies leicht feststellen, wenn Sie verschiedene Druckzeilenanweisungen in die beiden Setter einfügen.

+0

So wird die Methode setI() in A nie aufgerufen. Ist es? – ChangWook

+0

Verstanden. Vielen Dank!! =) – ChangWook

Verwandte Themen