アプリ版:「スタンプのみでお礼する」機能のリリースについて

継承についてです。

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に記述すればエラーは起こりませんが、これはわかります。


ウェブを探したのですが、検索の仕方が悪かったのかこれに関する記事をさがせなかったので質問いたしました。

A 回答 (5件)

考え方が逆のような気がします。


Aが親でBが子なので、
Aで宣言されたメソッドをBで使うことは出来ても、
Bで宣言されたメソッドはAで使うことは出来ないと思います。

なので、Aのほうにtestメソッドを作成し、
Bの宣言をなくして使うのが普通かと。
    • good
    • 0
この回答へのお礼

>なので、Aのほうにtestメソッドを作成し、
>Bの宣言をなくして使うのが普通かと。

これは大丈夫です。私が書いたソースは実際書いているソースをかなり簡略して書いてしまったので、変なソースに見えてしまったのかもしれません・・・

A a = new B

としたときに a は Bの参照先が代入されてしまっているわけですよね? #2さんのおっしゃるとおりキャストされたような形なので、Bのメソッドをそのまま使えるんじゃないのかなっておもってしまったんです。 書式的にAにはtestメソッドが無いから、a.test()というのはまずいというのはわかるのですが、Bにキャストしてるんだからいいんじゃないの?って疑問に思っちゃってました

お礼日時:2004/10/18 23:46

クラスBは、クラスAを継承していますが、


クラスAには、test()というメソッドがないので、
キャストできたとしても、a.test()はできないと思います。
逆ならいいですけど。
    • good
    • 0
この回答へのお礼

>キャストできたとしても、a.test()はできないと思います。

うむむ、やはりそういう仕様だったんですね、、

ありがとうございました。

お礼日時:2004/10/18 23:49

キャストしてみたらどうでしょうか。



((B)a).test();
    • good
    • 0

>Bにキャストしてるんだからいいんじゃないの


逆です
Bのオブジェクトを(キャストして)Aに入れるだと思う。
    • good
    • 0

そのオブジェクトがどのクラスなのかというのは、インスタンス自体に対して決まるのではありません。

それを入れる変数で決まるのです。

Bのインスタンスを生成しても、A型の変数aに入れたらそれはAのインスタンス(つまりtest()がない)なのです。
もちろんこれはBがAを継承しているからこそできることなのですがね。

また、余談になりますが、Bにキャストしても使えるというのも、もともとBのインスタンスとして生成したからこそです。そうでなければ、Bにキャストしたからと言ってtest()が使えるとは限りません。
    • good
    • 0

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