2016-07-03 3 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

, 당신은 당신의 주요 방법에 다음을 추가하는 경우 : 내리 뜬가 발생하지 않습니다 method의 두 번째 호출에서

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

. 두 번째 호출은 Animal이 메소드에 전달 될 수 있음을 보여 주므로 메소드 본문에서 해당 가능성을 설명해야하거나 메소드가 예외를 throw하는 경우가 있습니다.

+0

그게 전부 다운 캐스팅은 instanceof 연산자의 도움없이 수행 할 수 있습니다.하지만 그게 무슨 소용입니까 ?? –

+0

어떻게 다운 캐스팅 할 수 있습니까? – markspace

+0

클래스 동물 {} Dog3 동물 { 정적 무효 방법 (동물 a) { Dog3 D = (Dog3)을 연장 클래스 A // 에서 System.out.println을 downcasting ("OK downcasting 수행"); } public static void main (String [] args) { 동물 a = 새 Dog3(); Dog3.method (a); } }이 코드조차도 instanceof 연산자를 사용하지 않고도 정상적으로 작동합니다. –

1

힙에있는 개체의 유형은 Dog3이며 변경되지 않습니다. 그러나 가리키는 참조 Dog3 또는 anything super Dog3 될 수 있으며 변경해야 당신이 예제는 Dog3 클래스

+0

좋아요, 제가 요점을 얻었지만 요점은이 다운 캐스팅이 instanceof 연산자의 도움없이 수행 될 수 있다는 것입니다. 그렇다면 사용은 무엇입니까? –

+0

@MrinalAhuja 왜냐하면 당신의 객체'a'가 실제로'Dog'가 아닌'Cat'이었고'Dog'가 아니었다면 당신은'Dog'에 내리려고 할 때 당신의 프로그램이 충돌 할 것이기 때문입니다. 그래서'instanceof'로 검사하여'a'가'개'인지 확인한 후에 당신을'개'로 내린 것입니다. 다운 캐스트하기 전에'instanceof'를 사용할 필요는 없지만 그렇게해야합니다. – eric