• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:親クラスと子クラスのフィールドとメソッドについて )

親クラスと子クラスのフィールドとメソッドについて

このQ&Aのポイント
  • 親クラスと子クラスのフィールドとメソッドについての解説です。
  • 親クラスと子クラスのフィールドとメソッドが異なる動作をする原理について説明します。
  • 実行結果の違いを通じて、フィールドとメソッドの動作原理を明確にします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tekebon
  • ベストアンサー率62% (36/58)
回答No.2

Javaの仕様ではフィールドにアクセスする場合には変数の型に依存します。 質問文ではoyaクラスの変数objからobj.str_fieldとなっていますので、 oyaクラスのフィールドの値である"親実行"が表示されます。 koクラスの変数objでobj.str_fieldとすれば koクラスのフィールドの値である"子実行"が表示されます。 言語仕様のサイトのフィールドとメソッドの名前解決に関するリンクを紹介しておきます。 http://www.y-adagio.com/public/standards/tr_javalang/6.doc.htm#22133 http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#20448

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

一言で答えるなら、「メソッドはオーバーライドできるが、フィールドはオーバーライドできないから」です。 もう少し説明してみます。区別のために、oyaクラスのstr_fieldをF1、koクラスのstr_fieldをF2と呼ぶことにします。 oyaクラスのオブジェクトは当然F1しか持っていませんが、実はkoクラスのオブジェクトはF1とF2の両方を持っています。 さらに、フィールドのアクセスは内部的にはフィールドの名前ではなくて「このオブジェクトのn番目のフィールド」という形で行われます。 execクラスとoyaクラスでのstr_fieldへのアクセスは1番目のフィールド(F1)へのアクセス、koクラス内でのstr_fieldへのアクセスは2番目のフィールド(F2)へのアクセスとして理解されます。 したがって、execクラス内でobjが指しているのがkoクラスのオブジェクトであっても、koのF1へアクセスするので「親実行」の文字列が得られます。

b_hunter
質問者

補足

解答ありがとうございます。 > メソッドはオーバーライドできるが、 > フィールドはオーバーライドできないから ソースを書き換え、ko型変数にkoクラスのインスタンスを 作成するように変更した場合は、str_fieldへのアクセスが koクラスのものになることに説明がつかないように感じます。 恐縮ですが、こちらについてもご回答いただけないでしょうか。

関連するQ&A