Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

メソッドの呼び出し

お世話になります。

下記を実行すると「Child」と表示されます。

これは、aで呼び出されているメソッドが変数の型では
なく、オブジェクトの型のものが呼び出されているから
だと思いますが、bのメソッドを呼び出すことができま
せん。

オブジェクトの型のものを呼び出しているのであれば
bも呼び出すことができると思うのですが、なぜ呼び出
せないのでしょうか。

どうかご教授ください。

--------------------------------------------
class test {
  public static void main(String[] args) {
    ClassParent p = new ClassChild();
    p.getMsgP();              a
    p.getMsgC();   // NG
  }
}

class ClassParent {
  void getMsgP(){
    System.out.println("Parent");
  }
}
class ClassChild extends ClassParent {
  void getMsgP(){
    System.out.println("Child");
  }
  void getMsgC(){                        b
    System.out.println("Child2");
  }    
}

7

回答

5389

閲覧

7件の回答

評価

0

>オブジェクトの型のものを呼び出しているのであれば

オブジェクトの方がClassParentだから。

評価

0

お返事ありがとうございます。

説明ですが、よくわかりません。
もう少し詳しく教えていただけると助かります。

評価

0

失礼。誤変換だ。

>オブジェクトの型のものを呼び出しているのであれば

オブジェクトの型がClassParentだから。

評価

0

なんのためにClassParentで宣言してるんだ?

class ClassChild2 extends ClassParent {
void getMsgC2(){}
}

があったとして、

    ClassParent p = (flg) ? new ClassChild() : new ClassChild2();
    p.getMsgC();

コンパイラはpに何が入ってるのか分かるのか?

評価

0

不良社員様がおっしゃっているように、
pの型はClassParentだから、
pはClassParentの振る舞いしか出来ないのです。
だからClassChildの振る舞いであるgetMsgCは、
ClassParentには出来ません。


でも、参照先のインスタンスClassChildが、
getMsgPを再定義しているから、
出力されるのはChild。ということに。
静的束縛、で検索するとシアワセになれそうです。


評価

0

ふむ。IS-AとHAS-Aがわからなくなっちゃってるわけですね。
あとメソッドのオーバーライドね(サブクラスによる親メソッドの再定義)。
継承とオーバーライドについて勉強しましょう。
Javaに限ったことではないので頑張って覚えましょう。

評価

0

静的束縛で調べたところシアワセになれました
ヾ(〃^∇^)ノ

オーバーライドは動的束縛が適用されるのですね、
勉強になりました。

皆さん、どうもありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。