2016-09-09 14 views
3

私はOCAJP JAVAサンプルの質問をいくつか調べていましたが、次の質問に遭遇しました。Java継承とキャスト

次のコードを検討してください。

interface I{ } 
class A implements I{ } 
class B extends A { } 
class C extends B{ } 

そして、次の宣言:

A a = new A(); 
B b = new B(); 

エラーなしでコンパイルして実行しますか?

A. a = (B)(I)b; 
B. b = (B)(I) a; 
C. a = (I) b; 
D. I i = (C) a; 

これは意味があります。私が理解していないのは、B.が正解ではないということです。それは誤った選択だと言いました。なぜなら、aはクラスBのオブジェクトを指していないので実行時に失敗するからです。

私は実際にEclipseに行き、コード全体を書きました。明らかにCはコンパイルされず、Dは実行時に失敗しました。私のコードで少なくとも問題なくコンパイルされています。私はここに何かを逃していますかまたは本は実際に間違っていますか?ここ

public class Test{ 
public static void main (String[]args){ 
    A a = new A(); 
    B b = new B(); 

    a=(B)(I)b; 
    b=(B)(I)a; 
    } 
} 

interface I{ } 
class A implements I{ } 
class B extends A { } 
class C extends B{ } 

答えて

6

問題がシーケンシャル文です:私は実際にEclipseに入れ コードは、このでした。

a=(B)(I)b; 

b=(B)(I)a; 

あなたは既に最初の文でabを割り当てました。両方のステートメントを独立して実行すると(シーケンスではなく)、説明された動作が表示されます。

+1

あなたは私にそれを打つ。 –

0

OCP試験の準備をしている場合は、Jeanne BoyarskyとScott SelikoffのStudy Guideを読む必要があります。 オブジェクト間の継承関係を理解するには、このObjectA オブジェクトBですか?

例:The Dog is A Animal?ええ、犬は動物から継承しています。継承は、ビジネスオブジェクト間の一貫性を表現しなければならない概念です。鋳造用

、いくつかのルールを覚えている:サブクラスからスーパークラスにオブジェクトをキャスト

  1. は、明示的なキャストを必要としません。

  2. オブジェクトをスーパークラスからサブクラスにキャストするには、明示的キャストが必要です。

  3. コンパイラは、無関係な型へのキャストを許可しません。
  4. コードが問題なくコンパイルされても、キャストされるオブジェクトが実際にそのクラスのインスタンスでない場合、実行時に例外がスローされることがあります。

希望します。