• ベストアンサー

継承について

継承についてです。 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に記述すればエラーは起こりませんが、これはわかります。 ウェブを探したのですが、検索の仕方が悪かったのかこれに関する記事をさがせなかったので質問いたしました。

質問者が選んだベストアンサー

  • ベストアンサー
  • shige_70
  • ベストアンサー率17% (168/946)
回答No.5

そのオブジェクトがどのクラスなのかというのは、インスタンス自体に対して決まるのではありません。それを入れる変数で決まるのです。 Bのインスタンスを生成しても、A型の変数aに入れたらそれはAのインスタンス(つまりtest()がない)なのです。 もちろんこれはBがAを継承しているからこそできることなのですがね。 また、余談になりますが、Bにキャストしても使えるというのも、もともとBのインスタンスとして生成したからこそです。そうでなければ、Bにキャストしたからと言ってtest()が使えるとは限りません。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>Bにキャストしてるんだからいいんじゃないの 逆です Bのオブジェクトを(キャストして)Aに入れるだと思う。

  • jun2004
  • ベストアンサー率42% (24/57)
回答No.3

キャストしてみたらどうでしょうか。 ((B)a).test();

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

クラスBは、クラスAを継承していますが、 クラスAには、test()というメソッドがないので、 キャストできたとしても、a.test()はできないと思います。 逆ならいいですけど。

arcsin
質問者

お礼

>キャストできたとしても、a.test()はできないと思います。 うむむ、やはりそういう仕様だったんですね、、 ありがとうございました。

  • nanimania
  • ベストアンサー率36% (34/93)
回答No.1

考え方が逆のような気がします。 Aが親でBが子なので、 Aで宣言されたメソッドをBで使うことは出来ても、 Bで宣言されたメソッドはAで使うことは出来ないと思います。 なので、Aのほうにtestメソッドを作成し、 Bの宣言をなくして使うのが普通かと。

arcsin
質問者

お礼

>なので、Aのほうにtestメソッドを作成し、 >Bの宣言をなくして使うのが普通かと。 これは大丈夫です。私が書いたソースは実際書いているソースをかなり簡略して書いてしまったので、変なソースに見えてしまったのかもしれません・・・ A a = new B としたときに a は Bの参照先が代入されてしまっているわけですよね? #2さんのおっしゃるとおりキャストされたような形なので、Bのメソッドをそのまま使えるんじゃないのかなっておもってしまったんです。 書式的にAにはtestメソッドが無いから、a.test()というのはまずいというのはわかるのですが、Bにキャストしてるんだからいいんじゃないの?って疑問に思っちゃってました

関連するQ&A