<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
출력:
비공개 f()
데리 바
왜요?
<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
출력:
비공개 f()
데리 바
왜요?
우선 이는 private
메서드가 f()
인스턴스 변수를 가져올 수 있는 것처럼 getter
의 private
메서드를 직접 호출하는 것이 아닙니다.
여기에 상속 문제가 있습니다. Derived
클래스의 f方法
은 상위 클래스 PrivateOverride f方法
를 다시 작성한 것이 아닙니다. 재정의된 메서드에서는 재정의된 메서드의 액세스 권한 수정자를 변경할 수 없도록 요구하기 때문입니다. hello
메서드에서 this.f()
을 실행하면 컴파일러는 먼저 에 가장 가까운 f
(즉, 상위 클래스의 f
)을 찾습니다. 그래서 private f()
가 입력되었습니다.
물론 실제 개발에서는 이런 혼란을 피하도록 노력해야 하며, 기본적인 면접 질문은 해도 괜찮습니다.
공개 메소드를 통해 비공개 메소드에 액세스하고 있습니다. 괜찮습니다
public void hello()는 공개 메소드입니다
이 클래스를 호출할 수 있는 비공개 메소드입니다
위의 예에 따르면 하위 클래스가 상위 클래스의 비공개 메서드에 액세스할 수 있다는 의미는 아닙니다. hello
자체가 상위 클래스의 메소드이기 때문입니다.
하위 클래스가 다음과 같은 경우:
<code>class Derived extends PrivateOverride { public void hello() { System.out.println("public f()"); } public void bar(){ this.f(); //... } }</code>
정상적으로 실행될 수 있다면 하위 클래스가 상위 클래스의 프라이빗 메소드에 접근할 수 있다는 의미입니다.