推しミネラルウォーターはありますか?

以下のような問題(SJC-P試験)があり、
解説では考え方として
●メンバがフィールドなら「変数の型」
●インスタンスメソッドなら「実際のオブジェクトの型」
●クラスメソッドなら「変数の型」
とありました。

できればなぜこのような考え方(法則)になるか理解したいと思っています。
#当方、Javaプログラミング経験ゼロで、実際に下記のようなコーディングをするかどうかもわかりませんが、
#丸暗記だと実際のコーディングで使えそうにないので、できれば理解したいと思ってます。

下記問題は解説の考え方さえ丸暗記すれば解けるのかもしれませんが
(なぜ解説のような考え方になるのか含め)教えていただけませんでしょうか。
-----
【問題1】
class Super{
 int d = 10;
 void meth()System.out.println(d);
}
class Sub extends Super{
 double d = 20.0;
 void meth()System.out.println(d);
}
class Sample1{
 public static void main(String[] args){
 Super s = new Sub();
 System.out.println(s.d);
 s.meth();
}
【答え】
10
20.0
-----
【問題2】
class Super{
 static int d = 10;
 static void meth()System.out.println(d);
}
class Sub extends Super{
 static double d = 20.0;
 static void meth()System.out.println(d);
}
class Sample2{
 public static void main(String[] args){
 Super s = new Sub();
 System.out.println(s.d);
 s.meth();
}
【答え】
10
10
-----
よろしくお願い致します。

A 回答 (1件)

う~~ん、これってなかなか難しいですよね。


こういう動作をするように(JAVAでは)なってるとしか言いようがないような気がしますが、一応説明を試みてみます。
今スーパークラスと、そのサブクラスがあって、
同じフィールド名、同じメソッド名があるとすると、
サブクラスでは、上位クラスのフィールドやメソッドはオーバーライド(上書)されて、それぞれのクラスのモノが使われるというのは良いですよね。
今問題となっているのは、スーパークラスの変数にサブクラスの変数を入れた場合どうなるか?
ということなんですが、
スーパークラスからは、スーパークラスのメソッドやフィールドにしかアクセスできないというのは良いですか?
このルールで言うと、例外となるのは、質問文の問題でいうと、インスタンスメソッドがスーパークラスに代入(やキャスト)したのに、どうして、スーパークラスのメソッドが使われないで、サブクラス自身のメソッドが使われるのかということですね。
言語の実装としては、スーパークラスのメソッドが使われるような実装もありだと思いますが、そのようになっていないのは、スーパークラス変数にサブクラスの変数を代入して使うということがどういうこと(どういうことであって欲しい)かということだと思います。
スーパークラスの変数には、その配下となるさまざまなサブクラスの変数を代入できますが、そのようにするのは、それぞれのサブクラスをまとめて扱いたいからです。その時に、せっかくそれぞれの特殊化したメソッドでなくて、スーパークラスのメソッドしか使われないのであれば、何をやってんだかわからないです。つまり、変数に対して同じメソッドを使って、それぞれの特殊化した(サブクラスで定義された)メソッドを使って欲しいわけです。
まあ、そういうわけで、スーパークラス変数に代入したサブクラス変数のインスタンスメソッドが呼ばれます。

staticメソッドについては、staticメソッドは、インスタンスから呼び出しができますが、インスタンスが無くても呼び出せるクラスに固有のメソッドです。(クラスメソッド)なので、そのクラスのメソッドが呼び出されるのは、妥当です。
    • good
    • 0
この回答へのお礼

BLUEPIXYさん、いつもありがとうございます。

>そのようになっていないのは、スーパークラス変数にサブクラスの変数を代入して使うということがどういうこと(どういうことであって欲しい)かということだと思います。
このような考え方が私には出来ていませんでした。たしかにその通りですね。
書いていただいた事を何回も読み返してようやく理解できるようになりました。何だか喉の痞えが取れた気がします。
単なるJavaの決め事として丸暗記するのではなく、理由を納得できてよかったです。

まだSJC-P試験勉強の序盤戦。
今後もまだまだ???という部分に出会い、質問させていただくかもしれませんが、よろしくお願いします。

お礼日時:2005/08/21 19:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!