お世話になっております。JAVAのプログラムに関しての

質問です。スーパークラスA、サブクラスBが存在するとき
に、型をスーパークラスAとした、サブクラスBを作成
したとします。→(2)

このとき、(3)のように、キャストをしながらメソッドを
実行できないものかと思いましたが、コンパイルエラーと
なりました。

(4)の形であればOKですが、(3)がだめな理由が分かりません。
ご存知の方、おられましたらご教授下さいますよう宜しく
お願いします。

class A {
int test(){
return 1;
}
}

class B extends A {
//オーバーライド
int test() {
return 2;
}
//独自のメソッド
int test1() {
return 3;
}
}

class C {
public static void main(String args[]){
//OK
B b = new B();
System.out.println(b.test()); //2 (1)

//OK
A b1 = new B();
System.out.println(b1.test()); //2 (2)

//NG
System.out.println((B)b1.test1()); //3 (3)

//OK
B b2 = (B)b1;
System.out.println(b2.test1()); //3 (4)
}
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/07/03 17:30:48
  • 終了:2006/07/03 18:02:21

回答(2件)

id:yo-kun No.1

yo-kun回答回数220ベストアンサー獲得回数302006/07/03 17:59:58

ポイント60pt

キャスト演算子が演算子.よりも優先順位が低いせいです。

(B)b1.test1()は

b1.test1()

が評価されてからBへのキャストをしようとします。

ですからb1(Aインターフェースをもつ変数)にはtest1()というメソッドが存在せずコンパイルエラーとなるのです。


よって次のように先にキャストが行われるように括弧で優先順位を変えてください。

((B)b1).test1()

つまり(3)を正常に動作させるには

System.out.println(((B)b1).test1());

と書かねばなりません。


http://www5c.biglobe.ne.jp/~ecb/java/05_10.html

id:mimio17

ご回答ありがとうございます!

納得です!

2006/07/03 18:01:59

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 おこめ 33 30 2 2006-07-03 17:54:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません