부모 클래스와 자식 클래스의 멤버 변수가 각각 힙에 저장되어 있기 때문에 부모 클래스가 존재하기 때문일 수도 있으므로 부모 클래스의 멤버 변수를 먼저 찾는다고 추측하기 시작했습니다. 그런 다음 테스트해 보니 코드는 다음과 같습니다.
으아악출력은 다음과 같습니다.
Z:test.Z@15db9742
Z:5
f:test.Z@15db9742
f:10
f 그리고 이것은 동일한 개체를 가리키고 동일한 변수에 액세스하지만 결과가 다르므로 위의 추측은 틀렸음에 틀림없습니다. 그렇다면 부모 클래스의 멤버 변수에 액세스하기 위해 동일한 이름을 가진 멤버 변수에 대한 다형성 호출이 발생하는 정확한 원인은 무엇일까요?
f는 하위 클래스 객체를 나타냅니다. 메소드를 다시 작성하고 오버로딩한다는 이야기는 들어봤지만 클래스 변수에 대해서는 들어본 적이 없습니다. 제가 실행한 프로그램은 상황에 따라 다릅니다. 메소드가 호출되면 실제 객체가 가리키는 것입니다. 객체 Z), 클래스 변수의 이름이 같은 경우 살아있는 객체의 클래스 변수 값입니다.
Java에서 메소드의 재작성, 오버로딩 및 동적 연결은 다형성을 구성합니다.
귀하의 예는 메소드 재작성으로 입증된 다형성입니다.
선언된 것은 실제로 하위 클래스 Z를 가리키는 상위 클래스 F입니다. 이는 상향 유형 변환과 동일합니다. Z도 F에서 상속되므로 이제 Z는 F 유형으로 상향 변환될 수 있기 때문입니다.
여기서 f 변수는 Z로 인스턴스화되지만 F 유형이며 F의 특성을 보여줍니다.