- PR -

変数の継承について

投稿者投稿内容
setomune
会議室デビュー日: 2002/07/10
投稿数: 3
投稿日時: 2002-07-10 17:45
はじめまして。瀬戸と申します。いつも読ませて頂いております。

同名変数がスーパークラスに存在する時に、スーパークラスのメソッドを
実行したら同名変数はスーパークラスを参照しました。
自クラスの同名変数を参照させるにはどのようにすればよいでしょうか?

以下サンプルソースです。
「私は子供です。」と返ってくると思っていたものが「私は親です。」と返ってきました。
環境は
WindowsNt4.0
JDK 1.3
です。

//実行クラス
public class DoTest{
public static void main(String args[]){
Child c1 = new Child();
c1.print();
}
}
//スーパークラス
public class Parent{
private String JIBUN = "親";
public void print(){
System.out.println("私は" + JIBUN + "です。");
}
}
//子クラス
public class Child extends Parent{
private String JIBUN = "子供";
}

説明できそうでしたら、よろしくお願いします。

[ メッセージ編集済み 編集者: setomune 編集日時 2002-07-10 18:09 ]
takasaki
常連さん
会議室デビュー日: 2002/02/14
投稿数: 31
投稿日時: 2002-07-10 18:22
うまく説明はできないのですが、これはどうでしょうか。

//スーパークラス
public class Parent{
String JIBUN = "親";
public void print(){
System.out.println("私は" + JIBUN + "です。");
}
}
//子クラス
public class Child extends Parent{
private String JIBUN = "子供";
Child(){
super.JIBUN = JIBUN;
}
}
setomune
会議室デビュー日: 2002/07/10
投稿数: 3
投稿日時: 2002-07-10 19:01
早速の返信ありがとうございます。
確かにtakasakiさんのおっしゃるとおりに実装すれば、要求を
満たすことが出来そうですね。ありがとうございます。
でも、どうして子クラスで継承したメソッドを実行したら親クラスの
変数を参照するのでしょうか?いまいち理解できません。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-07-10 20:14
>でも、どうして子クラスで継承したメソッドを実行したら親クラスの
>変数を参照するのでしょうか?いまいち理解できません。
多分,

継承した場合,それは親クラスのメソッドと同じ物をもう一つ
作るのではなく,親クラスのメソッドそのものなんです.
#少なくとも実装レベルではそうなってるはず.

親クラスのメソッドだから子クラスのフィールドに
アクセスできないのは当然でしょう.

もう一つの理由としては,そういうことをやらせると
パフォーマンスが低下するというのもありますね.毎回
instanceofを実行するようなものですから.
setomune
会議室デビュー日: 2002/07/10
投稿数: 3
投稿日時: 2002-07-11 08:43
>継承した場合,それは親クラスのメソッドと同じ物をもう一つ
>作るのではなく,親クラスのメソッドそのものなんです.
>#少なくとも実装レベルではそうなってるはず.

親クラスと同じものを子クラスに作るもんだと考えてました。
親クラスのメソッドそのものということであれば、分かります。
納得できました。ありがとうございました。
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2002-07-12 20:13
> 継承した場合,それは親クラスのメソッドと同じ物をもう一つ
> 作るのではなく,親クラスのメソッドそのものなんです.
私はこの説明だけでは納得いかないので、質問させて下さい。

class Parent{
protected String JIBUN = "親";
public void print(){
System.out.println("私は" + JIBUN + "です。");
System.out.println("私は" + myName() + "です。");
}
protected String myName(){
return JIBUN;
}
}
class Child extends Parent{
protected String JIBUN = "子供";
protected String myName(){
return JIBUN;
}
}

とすると、実行結果は、

私は親です。
私は子供です。

となります。
変数のオーバーライドとメソッドのオーバーライドは何で違うんでしょうか?
せるふぃっしゅ
会議室デビュー日: 2002/06/27
投稿数: 6
投稿日時: 2002-07-12 23:03
引用:

変数のオーバーライドとメソッドのオーバーライドは何で違うんでしょうか?



こんばんは。

Child c = new Child();
System.out.println("Child.myName()="+c.myName());
System.out.println("Parent.myName()="+((Parent)c).myName());
System.out.println("Child.JIBUN="+c.JIBUN);
System.out.println("Parent.JIBUN="+((Parent)c).JIBUN);

この結果は、

Child.myName()=子供
Parent.myName()=子供
Child.JIBUN=子供
Parent.JIBUN=親

となります。

分かりましたか?
もうちょっと考えて見ましょう!

#悩んだほうが記憶に残りますので。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-07-13 00:24
引用:

t-wataさんの書き込み (2002-07-12 20:13) より:
変数のオーバーライドとメソッドのオーバーライドは何で違うんでしょうか?


今回の例のオブジェクトと仮想メソッッドテーブルを簡単に書くと下の様になるんだと思います。
コード:
オブジェクト
         Parent                    Child
         [JIBUN              ]     [JIBUN              ]
         [VMTへのポインタ    ]     [VMTへのポインタ    ]
                                   [JIBUN              ]

VMT
         Parent                    Child
         [printへのポインタ  ]     [printへのポインタ  ]
         [myNameへのポインタ ]     [myNameへのポインタ ]


上で分かると思いますが、フィールドとメソッドでは、状況が少し違います。
フィールドをオーバーライトすると言うのは、余り聞かないですよ?
この場合、同じ名前のフィールドが再定義された訳ですから、少し特殊ですよね。
「JIBUN」はオーバーライドされたというより、隠されたと考えるべきではないでしょうか?
(もし間違ってたら、誰かフォローをお願いします。)

スキルアップ/キャリアアップ(JOB@IT)