親クラスと子クラスのフィールドとメソッドについて
以下のサンプルソースを実行した時の動作の原理について
教えてください。
oya型変数にkoクラスのインスタンスを作成した場合、
メソッドはkoクラスのものなのに、
フィールドはoyaクラスのものになるということが
イマイチすっきり理解できません。
どういうことなんでしょうか。
-------------------------------------------------------
[ソース]
public class exec {
public static void main( String args[]){
oya obj = new ko();
System.out.println(obj.str_field);
obj.disp_field();
}
}
public class oya{
String str_field="親実行";
public void disp_field(){
System.out.println(str_field);
}
}
public class ko extends oya {
String str_field = "子実行";
public void disp_field(){
System.out.println(str_field);
}
}
-------------------------------------------------------
[実行結果]
> 親実行
> 子実行
-------------------------------------------------------
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へアクセスするので「親実行」の文字列が得られます。
この回答への補足
解答ありがとうございます。
> メソッドはオーバーライドできるが、
> フィールドはオーバーライドできないから
ソースを書き換え、ko型変数にkoクラスのインスタンスを
作成するように変更した場合は、str_fieldへのアクセスが
koクラスのものになることに説明がつかないように感じます。
恐縮ですが、こちらについてもご回答いただけないでしょうか。
No.2ベストアンサー
- 回答日時:
Javaの仕様ではフィールドにアクセスする場合には変数の型に依存します。
質問文ではoyaクラスの変数objからobj.str_fieldとなっていますので、
oyaクラスのフィールドの値である"親実行"が表示されます。
koクラスの変数objでobj.str_fieldとすれば
koクラスのフィールドの値である"子実行"が表示されます。
言語仕様のサイトのフィールドとメソッドの名前解決に関するリンクを紹介しておきます。
http://www.y-adagio.com/public/standards/tr_java …
http://www.y-adagio.com/public/standards/tr_java …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- Java eclipse実行ができない 2 2022/07/27 04:47
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
親クラスから子クラスへアクセス。
-
ASP Pageの孫継承のPage_Load
-
構造 他のクラスの構造体を別...
-
C# インターフェイスの実装
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
c++,ある関数のクラスから別の...
-
C#でほかのファイルにある自作...
-
違うクラスからの変数の共有化
-
C++/C#間での構造体の引き渡し...
-
Strategyパターンを用いた実装...
-
import と extends について
-
a href="..." とServlet
-
C#にて別クラスの関数を使いたい
-
javaでメインクラスが見つから...
-
無名パッケージからのインポート
-
Javaでswingの画面変わる際に他...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報