2017-11-19 15 views
2

私はVariables doesn't exhibit polymorphic behaviorを知り、その方法に限定されています。しかし、以下のコードは、オブジェクトの型を返す際に少し混乱します。オーバーライドされたメソッドが多態的な振る舞いを示さないのはなぜですか?

その子メソッドを呼び出す(これは正しい)、つまり子オブジェクトを返すことを意味します。だから、なぜ子変数の値を出力しないのですか?

class Parent { 

    int var = 11; 

    public Parent getInstance() { 
     System.out.println("In Parent ..."); 
     return new Parent(); 
    } 
} 

class Child extends Parent { 

    int var = 22; 

    public Child getInstance() { 
     System.out.println("In Child ..."); 
     return new Child(); 
    } 
} 


public class VariableHiding { 

    public static void main(String[] args) { 
     Parent p = new Child(); 
     System.out.println(p.getInstance().var); // something's fishy? 
    } 
} 


// Output : In Child ... 11 

PS:そのない(変数が多型に参加していないの話が、ここで言及した1子OBJのオブジェクトを返し、そのobjは代わりに、独自の親のVARを保持している)this oneの重複

答えて

0

p.getInstance()の戻り型は、のコンパイル時の型がParentpので、Parentであり、ParentgetInstance()方法はParentを返します。

あなたが書くしようとすることを見ることができますコンパイルを渡しません

Parent p = new Child(); 
Child c = p.getInstance(); 

したがって、p.getInstance().varは、Parentクラスのインスタンス変数を返します。

Childクラスのインスタンス変数を取得するためには、あなたがChildp.getInstance()をキャストする必要があります:

System.out.println(((Child)p.getInstance()).var); 

またはChildpの種類を変更するには:

Child p = new Child(); 
System.out.println(p.getInstance().var); 
+0

しかし、p.getInstance()はCHILDオブジェクトに評価されます。 –

+0

@実行時の型は、コンパイル時の型ではなく子である。 – Eran

0

ランタイム多型は変数に対しては達成できません。したがって、class Parent and Childには共通変数varがあります。それは常にスーパークラスの変数を参照する.SO(クラス親の型である)class Childで参照このp

Parent p = new Child(); 

、。行と

Parent p=new Child(); 

はない子供に、親への参照を宣言されているため

0

出力は、11の代わりに22です。これは正当なものです(子は親です)が、変数の場合は、変数の場合は、たとえ子として費やされたとしてもオブジェクトが親とみなされるため、子に書き込まれた値は考慮されません。 desideredとして変数VARは、次のよう

class Parent { 

    protected int var; 

    Parent(){ var=11;} 

    public Parent getInstance() { 
     System.out.println("In Parent ..."); 
     return new Parent(); 
    } 
} 

class Child extends Parent { 

    Child(){ var=22;} 

    public Child getInstance() { 
     System.out.println("In Child ..."); 
     return new Child(); 
    } 
} 

今回の結果は22である同じ主要機能を使用して、costructors内で定義された場合、値11がで定義されているため
話は、全く異なるであろう親のコスチュームは、子供のコスチュームで定義された値22によってオーバーライドされます。

関連する問題