첫째, 용어 설명 : Child
객체를 유형의 변수에 할당합니다 Parent
. , a Parent
의 하위 유형이되는 객체에 대한 참조 입니다.Parent
Child
더 복잡한 예에서만 유용합니다. getEmployeeDetails
Parent 클래스에 추가한다고 상상해보십시오 .
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는 컴파일 시간에 정적으로 형식화되기 때문에 컴파일러로부터 특정 보장을 받지만 교환 규칙을 따르지 않으면 코드가 컴파일되지 않습니다. 여기서 관련 보장은 하위 유형의 모든 인스턴스 (예 :)가 상위 유형 (예 :)의 인스턴스로 사용될 수 있다는 것 입니다. 예를 들어, 액세스 하거나 메소드 또는 필드가 유형 의 변수 에 할당 될 수있는 널이 아닌 객체에 정의되어 있음을 보장합니다.Child
Parent
Child
Parent
employee.getEmployeeDetails
employee.name
employee
Parent
. 이를 보장하기 위해 컴파일러 Parent
는 액세스 할 수있는 항목을 결정할 때 해당 정적 유형 (기본적으로 변수 참조 유형) 만 고려 합니다. 따라서 개체의 런타임 유형에 정의 된 멤버에 액세스 할 수 없습니다 Child
.
당신이 진정 Child
으로 a 를 사용하고 싶을 때 Parent
이것은 함께 살기 쉬운 제한이며 당신의 코드는 Parent
모든 하위 유형에 대해 사용할 수 있습니다 . 허용되지 않는 경우 참조 유형을 작성하십시오 Child
.