2013-10-14 3 views
0

자바의 수퍼 클래스 변수를 서브 클래스로 타입 캐스팅하거나 그 반대로 읽었습니다. 이들 중 어느 것이 유효합니까?자바의 수퍼 클래스로 서브 캐스팅 변수를 타이핑

Cat c = new Cat(); 
Animal a = c; 

Animal a = new Animal(); 
Cat c = (Cat) a; 

Animal a = new Cat(); 
Cat c = (Cat) a; 

Cat c = new Cat(); 
Dog d = (Dog) c; 

동물은 고양이와 강아지 하위 클래스가있는 수퍼 클래스입니다. acat 같이

+4

먼저 시도해보십시오. –

+0

왜 컴파일하고 보지 않습니까? –

+0

'cat'과'dog'는 어떤 종류의 타입도 아니기 때문에 내 생각 엔 캐스트가 유효하지 않습니다. – Bart

답변

0
Cat c = new Cat(); 
Animal a = c; 

Animal a = new Cat(); 
Cat c = (Cat) a; 
+0

첫 번째 하나는 거기 iffy, 고양이에 대한 생성자가 다른 물건을 설정하면 무엇입니까? –

+0

고양이가 개를 먹으면 어떨까요? – Troubleshoot

+0

아마도 호랑이에게 던지십시오. –

0

세 번째는 다른 컴파일러를 허용하거나하지 여부 위험한 넌센스입니다, 괜찮습니다.

+0

첫 번째 동물도 괜찮습니다. 상위 유형을 예상하는 메소드로 변수를 전달하거나 해당 항목의 상위 유형 목록에 항목을 추가하는 것과 똑같은 개념입니다. 물론 그것은 조금 바보 같지만, 이것은 나에게 고된 초기 숙제처럼 보입니다. –

+0

아니야, 그렇지 않다. 고양이를 동물로 전달하면 동물에 정의 된 메서드 만 호출하게된다. cat의 추가 속성이나 메서드가 예상대로 작동하지 않습니다. 그것을 바퀴벌레에 던질 수도 있습니다. –

+0

그들이 가상으로 정의되었거나 (Java로 작성 되었기 때문에 최종본이 아닌 경우) 또는 재정의 된 경우 제대로 작동합니다. 새 메서드 또는 속성 (Cat에서는 정의되었지만 Animal에서는 정의되지 않음) 인 경우 Animal 변수를 통해 액세스 할 수 없습니다. 이것은 상속의 전체 지점입니다. 고양이와 동물이 이런 식으로 행동하지 않으면 나쁜 디자인의 확실한 표시입니다 (Liskov 대체 원칙을 위반 함). –

관련 문제