人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

お世話になっております。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)
}
}

●質問者: mimio17
●カテゴリ:コンピュータ 学習・教育
✍キーワード:b2 Class Java NG Out
○ 状態 :終了
└ 回答数 : 1/2件

▽最新の回答へ

1 ● yo-kun
●60ポイント

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

(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

◎質問者からの返答

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

納得です!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ