- ベストアンサー
親クラスと子クラスのフィールドとメソッドについて
- 親クラスと子クラスのフィールドとメソッドについての解説です。
- 親クラスと子クラスのフィールドとメソッドが異なる動作をする原理について説明します。
- 実行結果の違いを通じて、フィールドとメソッドの動作原理を明確にします。
- みんなの回答 (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)
一言で答えるなら、「メソッドはオーバーライドできるが、フィールドはオーバーライドできないから」です。 もう少し説明してみます。区別のために、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へアクセスするので「親実行」の文字列が得られます。
補足
解答ありがとうございます。 > メソッドはオーバーライドできるが、 > フィールドはオーバーライドできないから ソースを書き換え、ko型変数にkoクラスのインスタンスを 作成するように変更した場合は、str_fieldへのアクセスが koクラスのものになることに説明がつかないように感じます。 恐縮ですが、こちらについてもご回答いただけないでしょうか。