2016-07-03 14 views
0

このコードは、ダウンキャスティングはここで例外なくスローされますが、オブジェクト(a)は既にクラスDog3のものでした。私がこのクラスのオブジェクト(a)を動物にしてダウンキャストしようとすると、例外がスローされました。しかし、Javaのtpointでは、これはinstanceof演算子で可能です。そうですか?例えばinstanceof演算子の使用

class Animal 
{ 
} 

class Dog3 extends Animal 
{ 
    static void method(Animal a) 
{ 
    if(a instanceof Dog3){ 
     Dog3 d=(Dog3)a;//downcasting 
     System.out.println("ok downcasting performed"); 
    } 
    } 

    public static void main (String [] args) 
{ 
    Animal a=new Dog3(); 
    Dog3.method(a); 
    } 

} 
+0

からいくつかの特定のメソッドを使用するには、例えば、Dog3の参照を使用したい場合は、その変更する必要があります'、異なるコードはダウンキャストを行わないようにする可能性があります。 – markspace

答えて

0

、あなたのmainメソッドに以下を追加した場合:ダウンキャストは発生しませんmethodの2番目の呼び出しで

public static void main (String [] args) 
    { 
    Animal a=new Dog3(); 
    Dog3.method(a); 
    Animal a2 = new Animal(); 
    Dog3.method(a2); 
    } 

。 2回目の呼び出しでは、Animalがメソッドに渡される可能性があることが示されているため、メソッド本体でその可能性を考慮する必要があります。また、メソッドによって例外がスローされることもあります。

+0

それは大丈夫ですが、私のポイントは、このダウンキャスティングはinstanceof演算子の助けなしに実行することができます。それは何ですか? –

+0

どのようにダウンキャストできますか? – markspace

+0

クラス動物{} DOG3は動物{ 静的ボイド方法(動物A){ DOG3 D =(DOG3)を拡張 クラス; // するSystem.out.printlnをダウンキャスト( "OKダウンキャストを行います")。 } public static void main(String [] args){ Animal a = new Dog3(); Dog3.method(a); } }このコードでも、instanceof演算子を使用せずに正常に動作します –

1

オブジェクトはヒープ上にあり、タイプはDog3であり、もちろん変更されません。しかし、それを指す参照がDog3またはanything super Dog3の可能性があり、あなたがメソッドのパラメータの型が `動物なのでDog3クラス

+0

大丈夫私はあなたの意見を持っていましたが、このダウンキャスティングはinstanceof演算子の助けなしに実行できます。それはどういう意味ですか? –

+0

@MrinalAhujaもしあなたのオブジェクト 'a'が' Cat'であって 'Dog'ではないならば、あなたは' Dog'にダウンキャストしようとするとあなたのプログラムはクラッシュするでしょう。そのため、 'instanceof'をチェックして、' a'が 'Dog'にダウンキャストされる前に' Dog'であることを確認するのです。ダウンキャストの前に 'instanceof'を使う必要はありませんが、そうするべきです。 – eric

関連する問題