- ベストアンサー
継承について
継承についてです。 class A { int x; } class B extends A{ public int test(){ return 1; } public static void main(String[]args){ A a = new B; a.test(); } } としたとき a.test(); という記述はできないものなのでしょうか?a.textでコンパル時にエラーが出ます。aはBのインスタンスを指しているから、test()もつかえるんじゃないかなとおもったのですが・・・ public int test(){return 0;}というのをクラスAに記述すればエラーは起こりませんが、これはわかります。 ウェブを探したのですが、検索の仕方が悪かったのかこれに関する記事をさがせなかったので質問いたしました。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
そのオブジェクトがどのクラスなのかというのは、インスタンス自体に対して決まるのではありません。それを入れる変数で決まるのです。 Bのインスタンスを生成しても、A型の変数aに入れたらそれはAのインスタンス(つまりtest()がない)なのです。 もちろんこれはBがAを継承しているからこそできることなのですがね。 また、余談になりますが、Bにキャストしても使えるというのも、もともとBのインスタンスとして生成したからこそです。そうでなければ、Bにキャストしたからと言ってtest()が使えるとは限りません。
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Bにキャストしてるんだからいいんじゃないの 逆です Bのオブジェクトを(キャストして)Aに入れるだと思う。
- jun2004
- ベストアンサー率42% (24/57)
キャストしてみたらどうでしょうか。 ((B)a).test();
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
クラスBは、クラスAを継承していますが、 クラスAには、test()というメソッドがないので、 キャストできたとしても、a.test()はできないと思います。 逆ならいいですけど。
- nanimania
- ベストアンサー率36% (34/93)
考え方が逆のような気がします。 Aが親でBが子なので、 Aで宣言されたメソッドをBで使うことは出来ても、 Bで宣言されたメソッドはAで使うことは出来ないと思います。 なので、Aのほうにtestメソッドを作成し、 Bの宣言をなくして使うのが普通かと。
お礼
>なので、Aのほうにtestメソッドを作成し、 >Bの宣言をなくして使うのが普通かと。 これは大丈夫です。私が書いたソースは実際書いているソースをかなり簡略して書いてしまったので、変なソースに見えてしまったのかもしれません・・・ A a = new B としたときに a は Bの参照先が代入されてしまっているわけですよね? #2さんのおっしゃるとおりキャストされたような形なので、Bのメソッドをそのまま使えるんじゃないのかなっておもってしまったんです。 書式的にAにはtestメソッドが無いから、a.test()というのはまずいというのはわかるのですが、Bにキャストしてるんだからいいんじゃないの?って疑問に思っちゃってました
お礼
>キャストできたとしても、a.test()はできないと思います。 うむむ、やはりそういう仕様だったんですね、、 ありがとうございました。