2012-05-14 12 views
3

なぜTestClass.main()の実行は202 202 101を出力しますか?私の貧弱なOOPの知識を持つOOPの継承の実行

class BaseClass 
{ 
    int data = 101; 
    public void print() 
    { 
     System.out.print(data + " "); 
    } 
    public void fun() 
    { 
     print(); 
    } 
} 
class SubClass extends BaseClass 
{ 
    int data = 202; 
    public void print() 
    { 
     System.out.print(data + " "); 
    } 
} 
class TestClass 
{ 
    public static void main(String[] args) 
    { 
     BaseClass obj = new SubClass(); 
     obj.print(); 
     obj.fun(); 
     System.out.print(obj.data); 
    } 
} 

私は実行がこの方法でなければならないと思う:)

の1- obj.print(; SubClassから202をプリントする

2 obj.fun()が存在しないので、メソッドは親メソッドを呼び出すので、出力は101

3 System.out.print(obj.data);サブクラスで値がオーバーライドされているので、202を出力する必要があります。

だから出力は202 101 202だと思うけど、それはなぜなのか説明できますか?

答えて

4

をコンパイルされません)。出力が実際101

なければならないので、サブクラスのメソッドは、それが親メソッドを呼び出し、それがfunのスーパークラスは、呼び出しが、スーパークラスは、printを呼び出し、printがオーバーライドされると、(サブクラスで)オーバーライドバージョン呼び出される。

System.out.print(obj.data);値がサブクラスで上書きされるので、202を出力する必要があります。

変数がBaseClassとして宣言objとして、オーバーライドが、サブクラスによって隠されていない、それが直接それにdataプロパティにアクセスします。メソッド呼び出しと異なり、これはコンパイル時に決定されます。

+0

これで、Binyaminに感謝します。できるだけ早くあなたの答えに印をつけます –

2

方法が多型であり、あなたがあなたのBaseClassから

int data = 101; 

を削除する場合のフィールドは

ないので何もobj.funがないので、それは(

0

1および2 - 方法は、多型です - フィールドありえない多型 - あなたはsub class

3への参照を持っている場合、それはとOFCことができるようになります場合base classからの方法はsub classからメソッドを使用します。それは参照の型から取られています。

1

どの方法が実行されるかを決定するのがトリックです。この選択は、オブジェクトのインスタンスのタイプから行われます。あなたの場合、objは​​であり、print()へのすべての呼び出しは​​という印刷方法を実行します。このメカニズムはPolymorphism in OOPと呼ばれます。

メソッドと変数を混合する代わりに、メソッドのテストだけを行うことをお勧めします。コードはほとんど同じで、同じ多態性を持ちますが、変数はありません。

class BaseClass 
{ 
    public void print() 
    { 
     System.out.print(101 + " "); 
    } 
    public void fun() 
    { 
     print(); 
    } 
} 
class SubClass extends BaseClass 
{ 
    public void print() 
    { 
     System.out.print(202 + " "); 
    } 
} 
class TestClass 
{ 
    public static void main(String[] args) 
    { 
     BaseClass obj = new SubClass(); 
     obj.print(); 
     obj.fun(); 
    } 
}