첫째, 용어 설명 : Child객체를 유형의 변수에 할당합니다 Parent. , a Parent의 하위 유형이되는 객체에 대한 참조 입니다.ParentChild
더 복잡한 예에서만 유용합니다. getEmployeeDetailsParent 클래스에 추가한다고 상상해보십시오 .
public String getEmployeeDetails() {
return "Name: " + name;
}
Child자세한 내용을 제공하기 위해 해당 메서드를 재정의 할 수 있습니다 .
@Override
public String getEmployeeDetails() {
return "Name: " + name + " Salary: " + salary;
}
이제 객체가 Parent또는 Child다음 과 같이 사용 가능한 모든 세부 정보를 가져 오는 코드 한 줄을 작성할 수 있습니다 .
parent.getEmployeeDetails();
다음 코드 :
Parent parent = new Parent();
parent.name = 1;
Child child = new Child();
child.name = 2;
child.salary = 2000;
Parent[] employees = new Parent[] { parent, child };
for (Parent employee : employees) {
employee.getEmployeeDetails();
}
결과는 다음과 같습니다.
Name: 1
Name: 2 Salary: 2000
우리 Child는을 Parent. 그것은에 행동이 고유의 전문 한 Child클래스,하지만 우리가 전화했을 때 getEmployeeDetails()우리는 방법에 차이 초점을 무시할 수 Parent와 Child유사하다. 이를 하위 유형 다형성 이라고 합니다.
업데이트 된 질문은 객체가 참조에 저장 Child.salary될 때 액세스 할 수없는 이유를 묻습니다 . 대답은 "다형성"과 "정적 타이핑"의 교차점입니다. Java는 컴파일 시간에 정적으로 형식화되기 때문에 컴파일러로부터 특정 보장을 받지만 교환 규칙을 따르지 않으면 코드가 컴파일되지 않습니다. 여기서 관련 보장은 하위 유형의 모든 인스턴스 (예 :)가 상위 유형 (예 :)의 인스턴스로 사용될 수 있다는 것 입니다. 예를 들어, 액세스 하거나 메소드 또는 필드가 유형 의 변수 에 할당 될 수있는 널이 아닌 객체에 정의되어 있음을 보장합니다.ChildParentChildParentemployee.getEmployeeDetailsemployee.nameemployeeParent. 이를 보장하기 위해 컴파일러 Parent는 액세스 할 수있는 항목을 결정할 때 해당 정적 유형 (기본적으로 변수 참조 유형) 만 고려 합니다. 따라서 개체의 런타임 유형에 정의 된 멤버에 액세스 할 수 없습니다 Child.
당신이 진정 Child으로 a 를 사용하고 싶을 때 Parent이것은 함께 살기 쉬운 제한이며 당신의 코드는 Parent모든 하위 유형에 대해 사용할 수 있습니다 . 허용되지 않는 경우 참조 유형을 작성하십시오 Child.