- - PR -
変数の継承について
1|2|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 ] | ||||||||
|
投稿日時: 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; } } | ||||||||
|
投稿日時: 2002-07-10 19:01
早速の返信ありがとうございます。
確かにtakasakiさんのおっしゃるとおりに実装すれば、要求を 満たすことが出来そうですね。ありがとうございます。 でも、どうして子クラスで継承したメソッドを実行したら親クラスの 変数を参照するのでしょうか?いまいち理解できません。 | ||||||||
|
投稿日時: 2002-07-10 20:14
>でも、どうして子クラスで継承したメソッドを実行したら親クラスの
>変数を参照するのでしょうか?いまいち理解できません。 多分, 継承した場合,それは親クラスのメソッドと同じ物をもう一つ 作るのではなく,親クラスのメソッドそのものなんです. #少なくとも実装レベルではそうなってるはず. 親クラスのメソッドだから子クラスのフィールドに アクセスできないのは当然でしょう. もう一つの理由としては,そういうことをやらせると パフォーマンスが低下するというのもありますね.毎回 instanceofを実行するようなものですから. | ||||||||
|
投稿日時: 2002-07-11 08:43
>継承した場合,それは親クラスのメソッドと同じ物をもう一つ
>作るのではなく,親クラスのメソッドそのものなんです. >#少なくとも実装レベルではそうなってるはず. 親クラスと同じものを子クラスに作るもんだと考えてました。 親クラスのメソッドそのものということであれば、分かります。 納得できました。ありがとうございました。 | ||||||||
|
投稿日時: 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-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=親 となります。 分かりましたか? もうちょっと考えて見ましょう! #悩んだほうが記憶に残りますので。 | ||||||||
|
投稿日時: 2002-07-13 00:24
今回の例のオブジェクトと仮想メソッッドテーブルを簡単に書くと下の様になるんだと思います。
上で分かると思いますが、フィールドとメソッドでは、状況が少し違います。 フィールドをオーバーライトすると言うのは、余り聞かないですよ? この場合、同じ名前のフィールドが再定義された訳ですから、少し特殊ですよね。 「JIBUN」はオーバーライドされたというより、隠されたと考えるべきではないでしょうか? (もし間違ってたら、誰かフォローをお願いします。) |
1|2|3
次のページへ»