최근에 하위 클래스 객체를 상위 클래스 객체에 할당한 경험이 있는데, 이를 여러분과 공유하고 싶습니다. 하지만 제 레벨이 제한되어 있으니 지적해 주시고 비판해 주시기 바랍니다.
집에 더 가까운 곳에서 몇 가지 작은 예를 살펴보세요.
하나를 테스트해 보세요
상위 클래스:
아강:
결과: 이것은 상위 클래스 print() 메소드입니다. 이때 객체는 Subclass@126b249입니다.
이때 객체는 Subclass@126b249입니다.
설명하다:
상위 클래스 sup=new 하위 클래스();
선언된 객체는 상위 클래스 객체이지만 실제 메모리 공간은 하위 클래스 객체에 속합니다.
상위 클래스에서 상속된 public void print() 메소드가 호출되고 출력은 하위 클래스 객체의 이름 확인입니다.
결론: 컴파일 시 선언된 객체는 부모 클래스 객체이지만, 런타임 시에는 서브 클래스 객체가 되며, 서브 클래스가 부모 클래스의 메서드를 오버라이드하지 않으면 이때 객체는 부모 클래스에서 상속받은 메서드를 호출하게 됩니다.
테스트 2
상위 클래스:
아강:
결과: 이것은 하위 클래스의 print() 메소드입니다. 현재 객체는 Subclass@126b249입니다.
이때 객체는 Subclass@126b249입니다.
설명하다:
이전 예제를 바탕으로 상위 클래스의 print() 메서드를 다시 작성했습니다. 이때 하위 클래스의 print() 메서드가 호출되었습니다.
결론: 이전 예제의 결론을 바탕으로 다음과 같은 결론에 도달했습니다. 이때 하위 클래스가 상위 클래스의 메서드를 작성하지 않으면 해당 개체는 실제로 하위 클래스 개체입니다.
그러면 이때 객체는 상위 클래스에서 상속받은 메서드를 호출하고, 그렇지 않으면 이때 객체는 하위 클래스의 메서드를 호출합니다.
질문: 위 테스트에서 다음과 같은 결론을 내릴 수 있습니까? 하위 클래스 객체를 상위 클래스 객체에 할당합니다(예: Supclass sup=new Subclass()).
우리가 얻는 것은 하위 클래스 객체입니다. 즉, sup는 하위 클래스 객체입니까??????
테스트 3
상위 클래스:
아강:
결과: 현재 속성: 상위 클래스 속성
참고: 첫 번째 테스트를 기반으로 className 속성을 상위 클래스에 추가하고 하위 클래스에서 이 속성을 재정의했습니다.
그런데 이때 객체의 속성을 출력하면 부모 클래스의 속성이 됩니다.
결론: 하위 클래스 객체를 상위 클래스 객체에 할당할 때 메서드와 속성은 정통 상속 관계와 매우 다릅니다.
질문:
현재 객체는 하위 클래스 객체인가요, 아니면 상위 클래스 객체인가요?
추측을 시작해 보세요:
추측하기 전에 몇 가지 사항을 확인해야 합니다.
1. 새로운 하위 클래스 객체를 생성하면 상위 클래스 객체의 생성자도 동시에 실행됩니다. 즉, 상위 클래스와 하위 클래스 객체에 필요한 일부 정보가 동일한 메모리 공간을 차지합니다.
메서드를 재정의하면 상위 개체를 사용하여 상위 클래스를 참조할 수 있습니다.
2. Java의 객체는 완전히 객체 지향적이지 않습니다. 즉, 객체의 속성과 메소드가 동시에 객체에 캡슐화되지 않습니다.
하지만 객체에는 고유한 속성이 있지만 메소드는 클래스의 메소드를 참조합니다. 클래스의 속성과 메소드에 대한 참조를 객체에 캡슐화한다고 할 수 있습니다.
따라서 객체가 호출하는 메소드는 자체 메소드가 아니라 클래스에 있는 메소드입니다. Java가 왜 이렇게 하는지는 모르겠습니다.
3. 객체가 메모리에 로드되면 클래스가 먼저 메모리에 로드된 다음 클래스가 메모리에 남아 있어야 합니다. 클래스가 메모리에서 사라지는 경우는 모르겠습니다.
저는 Java가 객체를 재활용하는 것처럼 자체적인 재활용 메커니즘을 가지고 있어야 한다고 생각합니다.
4. 컴파일과 실행은 완전히 다른 작업입니다. 컴파일 중에 수행하는 주요 작업은 객체 유형 선언, 속성 할당, 구문 오류 확인 등입니다.
런타임이 하는 일은 객체를 메모리에 로드하고(일반적으로 new를 사용하고, 리플렉션도 일반적으로 사용됨), 코드 실행 기능을 실행하는 것입니다.
5. 만약 여러분과 독자가 이 점에 대해 서로 공감하지 않거나, 이 점에 대해 동일한 이해를 갖고 있지 않다면 여러분은 내가 헛소리하고 있다고 생각할 것입니다.
저의 전문가 점수가 너무 낮아서 신뢰도가 낮다고 생각하실 수도 있겠지만, 제가 말씀드리고 싶은 것은 배움에는 순서가 없고, 마스터하는 사람이 먼저라는 것입니다.
하하, 이제 전문가 포인트를 부정적인 가치로 바꿀 준비가 되었습니다. 더 이상 말도 안 되는 소리는 하지 말고 계속하겠습니다.
추측:
1. Supclass sup=new Subclass()를 컴파일하면 sup 객체가 Supclass 클래스로 선언되므로, sup 객체의 속성은 상위 클래스 객체의 속성 값이 됩니다.
3. 2단계에서 계속해서 부모 클래스의 메서드를 재정의하면 sup 개체의 메모리 공간이 하위 클래스 개체의 메모리 공간이므로 하위 클래스 메서드인 public void print()가 메모리에 로드됩니다.
따라서 우리가 호출하는 것은 하위 클래스의 public void print() 메소드입니다. 상위 클래스의 재정의된 메소드를 호출해야 하는 경우 super를 사용해야 합니다.
이 구절은 테스트 2를 설명할 수 있습니다.
요약:
다음은 순전히 개인적인 의견입니다.
하위 클래스 객체를 상위 클래스 객체에 할당하면 결과 객체는 다음과 같은 객체가 됩니다.
상위 클래스 객체로 컴파일되지만, 하위 클래스 객체로 실행되는 구체적인 특징은 다음과 같습니다.
1. 부모 클래스 객체로 선언됨 2. 부모 클래스 속성을 가짐 3. 하위 클래스의 메모리 공간을 차지함 4. 하위 클래스 메서드가 상위 클래스 메서드를 재정의하면 이때 개체는 하위 클래스 메서드를 호출함. 그렇지 않으면 자동으로 상속됨 상위 클래스의 메소드라고 합니다.
5. 이 객체는 상위 클래스 객체도 아니고 하위 클래스 객체도 아닌 것 같습니다.
나는 그것을 하위 클래스 객체로 취급합니다. 만약 그 속성을 사용한다면 그것을 부모 클래스 객체로 취급합니다.
상위 클래스의 속성을 차지하고 하위 클래스의 메소드를 사용하는 객체인데, 어떤 객체인지는 선언에 따라 다르다고 생각하지만 하위 클래스가 있습니다. 행동 양식.
생각해 보세요:
테스트 3을 기반으로 서브클래스의 속성을 어떻게 추출합니까? ? ? ? ?