2017-01-06 6 views
0

に継承されたクラスのオブジェクトを割り当てるIはAとB Bが指す のインスタンスzが存在するクラスMの主な方法で今Aからスーパークラスオブジェクト

を継承二つの与えられたクラスを有しますB.

継承されたクラスのオブジェクトがスーパークラスに割り当てられている場合、サブクラスのメソッドは保持されています。

質問:なぜz.(-6)のために、のf(double y)が使用されていますか? つまり、出力が-8.0と4.0を与える理由を説明できますか?あなたの例では

public class A { 
    public int x = 2; 

    public A() { 
     this.x+++; 
    } 

    public A(int x) { 
     this.x += x; 
    } 

    public void f(double x) { 
     this.x = (int) (x + B.y); 
    } 
} 


public class B extends A { 
    public static double y = 3; 

    public double x = 0; 

    public B(double x) { 
     y++; 
    } 

    public void f(int y) { 
     this.x = y * 2; 
     B.y = 0; 
    } 

    public void f(double y) { 
     this.x = 2 * y + B.y; 
    } 
} 


public class M { 
    public static void main(String[] args) { 
    A a = new A((int) B.y); 
    System.out.println(a.x); // OUT: [5] 

    B b = new B(2); 
    System.out.println(b.x + " " + B.y); // OUT: [0.0] [4.0] 

    A z = b; 
    System.out.println(z.x); // OUT: [3] 

    z.f(-0.5); 
    System.out.println(b.x + " " + z.x); // OUT: [-6.0] [3] 

    z.f(-6); 
    System.out.println(b.x + " " + B.y); // OUT: [-8.0] [4.0] 
    } 
} 
+0

をランタイムx) 'である。また、意味のある変数名とメソッド名を使用してください。 –

+2

'z'の静的型は' f(int) 'を持たない' A'であるため、コンパイル時のメソッド解決は 'f(double)'を選択し、実行時に動的ディスパッチはオーバーライドされたバージョン'B'クラスのそのメソッドの。 –

答えて

1

z参照ないオブジェクトです。 zは実際にはコンパイラがそれを知っているかどうかをBインスタンスに示します。

なぜ、z(6)は、f(int y)ではなく、Bのf(double y)の方法ですか?

あなたはzAへの参照であり、これは上書きが、サブクラスによって過負荷にならないことができる唯一の方法f(double)を持っていることをコンパイラに語っています。呼び出されたメソッドのシグネチャは、コンパイル時に決定される。すなわち

(タイプそれはコンパイラのもの)、ないA`は `F(int型を持っていないので、`(ない実際の型)

関連する問題