- 締切済み
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:}
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- yamada_g
- ベストアンサー率68% (258/374)
記載のコードの場合、getNameメソッドはstaticメソッドなので >s.getName(); は Parent.getName(); と同じ事になります。 staticの場合はインスタンスではなくクラスを見るので(正確な言い方ではないと思いますが) 変数sの実体がChildクラスだとしても変数の型はあくまでParentクラスなので ParentクラスのgetNameメソッドが呼ばれます。 staticメソッドでない場合は、インスタンスを見るので 変数sの実体であるChildクラスのインスタンスのgetNameメソッドが呼ばれます。