글쎄, s1
이라는 참조를 Graduate
으로 선언했을 수 있습니다. super type
이라는 참조를 선언하면 얻을 수있는 가장 큰 이점은 다형성입니다.
하위 유형 객체를 가리키는 수퍼 유형 참조를 사용하면 동일한 참조를 여러 하위 클래스 객체에 바인딩 할 수 있습니다. 실제로 호출되는 실제 메소드는 어떤 객체가 가리키고 있는지에 따라 런타임에 결정됩니다. 그러나 이것의 주된 조건은 이며 그 메소드는 서브 클래스에도 정의되어야합니다. 그렇지 않으면 컴파일러은 메소드 선언을 찾지 못합니다.
여기에서는 수퍼 클래스에서 메서드를 정의하지 않았기 때문에 downcast
이되었습니다. 컴파일러는 Student
클래스에서 해당 메서드의 정의를 볼 수 없습니다. 실제 개체 인 s1
이 무엇을 가리키고 있는지 전혀 알 수 없습니다. 컴파일러는 참조 유형을 검사하여 메토 드 선언을 찾습니다.
일반적으로 코드의 하위 클래스로 다운 캐스팅 될 때마다 거의 항상 잘못된 기호가 나타납니다 (예외는 있지만). 그리고 수업을 수정해야합니다. 예를 들어
:
이의 대신 서브 클래스 참조의 수퍼 클래스 참조를 사용하여 얻을 어떤 이점 보자
class Phd extends Student {
getResearchTopic(){...}
}
과 : 당신은 같은 Student
의 또 다른 서브 클래스가 있다고 가정 Student
클래스에 정의 (기본값)를 제공합니다.
class Student {
getResearchTopic(){...}
}
지금, 당신은 둘 다 Student
참조로 지적되고하는 다음과 같은 두 개체를 만들 :
Student student = new Phd();
student.getResearchTopic(); // Calls Phd class method
student = new Graduate();
student.getResearchTopic(); // Calls Graduate class method
그래서, 단지 하나의 참고로, 당신은 하위 클래스에 고유 한 접근 방법에 도착.
단일 정적 방법은 어떤 조건에 따라 서로 다른 서브 클래스의 객체를 반환 factory method
패턴에서 볼 수있는이 기능을 하나의 주요 구현 : 그래서
public static Student getInstance(String type) {
if (type.equals("graduate"))
return new Graduate();
else if (type.equals("phd"))
return new Phd();
}
를 볼 수 있습니다 동일한 메소드는 다른 하위 클래스의 객체를 반환합니다.
그냥 있기 때문에 하나 개의 개념으로 할 수있는 위의 거즈의 모든
:
슈퍼 클래스 참조가 하위 클래스의 객체를 참조 할 수 있지만 그 반대.
내가 사용이 경우 downcasting 보이는 것을 말할 것 읽고있는 개체의 어떤 종류 확인할 수있는 방법 -
readObject()
항상 평범한 오래된Object
를 반환하기 때문에, 실제 타입으로obj
캐스팅 응용 프로그램의 디자인 문제처럼. 다운 캐스팅을 사용해야하는 곳 중 하나는 '같음'메소드를 오버라이드 할 때입니다 (가능한 dup 질문에 표시됨). –나는 어쨌든 대답 = \ 너무 오래 걸렸다. –