2016-11-17 9 views
0

Javaの継承に関するいくつかの問題に直面しています。 次の2つのプログラムがその出力を持つ理由を理解できません。 誰か助けてくれますか?どちらの場合も:)Java - 継承の理解の問題

1)

public class A { 
    int foo() { 
     return 1; 
    } 
} 

public class B extends A { 
    int foo() { 
     return 2; 
    } 
} 

public class C extends B { 
    int bar(A a) { 
     return a.foo(); 
    } 
} 

C x = new C(); 
System.out.println(x.bar(x)); 

// OUTPUT:2 

2)

public class A { 
    int e=1; 
} 

public class B extends A { 
    int e=2; 
} 

public class C extends B { 
    int bar(A a){ 
     return a.e; 
    } 
} 

C x= new C(); 
System.out.println(x.bar(x)); 

// OUTPUT:1 

答えて

1

、あなたは印刷機能にタイプCのオブジェクトを渡します。 bar関数は、タイプAのオブジェクトを要求しますが、タイプCのオブジェクトを渡すことは、Aのサブクラスであるため、引き続き受け入れられます。まず第一に、a.foo()a.eCオブジェクトで呼び出されていることに留意することが重要です。

どちらの場合でも、リスト内の最も低い属性またはメソッドを検索していることが起こります。

  1. ねえ、あなたはbarメソッドにタイプCのオブジェクトに渡されました:ここではJavaはパート1でやっていることの非常に単純化したバージョンです!さて、そのfooメソッドを呼び出しましょう。
  2. おっと! Cにはfooメソッドがありません!次にBクラスに進み、fooメソッドがあるかどうかを確認しましょう。
  3. Yay! Bにはfooメソッドがあるので、それを呼び出してみましょう。 Aクラスまでの私たちのように動作する必要はありません、我々はすでに、それはすべてのパラメータがAからCに意気消沈したという理解についてです私たちはB.

に必要なものを見つけたので。第2部では、まったく同じ種類のロジックが使用されています。タイプCのオブジェクトが渡されたため、その属性を含む階層の最下位クラスのオブジェクトBからe属性を取得します。

あなたの質問にお答えします。

+0

例2について間違っています - 出力は "1"です。クラスBはそれ自身のメンバーeを持ち、これは外部のために隠されている。 Bがメンバーeを持たずに値を設定した場合、出力は「2」になりますが、クラスAのメンバーの値A –

+0

Hmを読んでいないので、2番目のプログラム2だろうか? – Johanna

+0

@ジョハナ私のための質問ですか? –