• 締切済み

javaの継承について

以下のコードがある場合に、想定では「child」が出力されるとおもっていたのですが、 実際は「parent」が出力されます。 3行目でChildをnewしているので16行目のメソッドが呼び出され 画面に「child」が出力されると思っていたのですが、実行結果で その考えが違う事がわかりました。 実行結果から想定すると、3行目で定義している変数sは Parentクラスを指しているため、4行目で呼び出されるメソッドは 9行目になるのかなと思っています。 しかし、Parentクラス及びChildクラスのstaticを外すと 実行結果がchildとなります。 何故staticをつけた場合とつけない場合で実行結果が 異なるのでしょうか。 ■以下コード 1:public class samplexx { 2:  public static void main(String[] args){ 3:    Parent s = new Child(); 4:    System.out.println(s.getName()); 5:  } 6:} 7:class Parent{ 8:  public static String name ="parent"; 9:  public static String getName(){ 10:    return name; 11:  } 12:} 13: 14:class Child extends Parent{ 15:  public static String name="child"; 16:  public static String getName(){ 17:    return name; 18:  } 19:}

みんなの回答

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

記載のコードの場合、getNameメソッドはstaticメソッドなので >s.getName(); は Parent.getName(); と同じ事になります。 staticの場合はインスタンスではなくクラスを見るので(正確な言い方ではないと思いますが) 変数sの実体がChildクラスだとしても変数の型はあくまでParentクラスなので ParentクラスのgetNameメソッドが呼ばれます。 staticメソッドでない場合は、インスタンスを見るので 変数sの実体であるChildクラスのインスタンスのgetNameメソッドが呼ばれます。

関連するQ&A