내부 클래스는 기본 클래스의 개인 최종 메서드에 액세스 할 수 있지만 그 이유는 무엇입니까?

본능

자바 제작자가이 상황을 허용 한 이유는 무엇입니까? 나는 그것에 대한 어떤 이유가있을 것이라고 확신합니다. 아래 코드를 사용하면 LionCheetah 만큼 빠르게 장난스럽게 실행할 수 있습니다 .

public class animal {
    class carnivores {
       private final void runAsFastAsCheetah() {
           System.out.println("Ran as fast as Cheetah");
        }
    }
    public class Lion extends carnivores {
       public void runAsFastAsLion() {
           System.out.println("Ran as fast as Lion.");
           super.runAsFastAsCheetah();
        }
    }
    public static void main(String[] args) {
        animal animal = new animal();
        Lion lion = animal.new Lion();
        //lion.runAsFastAsCheetah(); //Not allowed but//
        lion.runAsFastAsLion();
    }
}

편집 : 라이온과 치타를 진지하게 받아들이는 사람들을 위해 코드를 수정했습니다.

public class foo {
    class A {
        private final void myMethod() {
            System.out.println("in private final myMethod()");
        }
    }
    public class B extends A {
        public void myMethod() {
            System.out.println("in B's myMethod()");
            super.myMethod();
        }
    }
    public static void main(String[] args) {
        foo foo = new foo();
        B b = foo.new B();
        b.myMethod();
    }
}
피터 로리

동일한 외부 클래스를 가진 모든 클래스는 동일한 외부 클래스 private의 다른 모든 클래스에 액세스 할 수 있습니다 . 이 기능은 중첩 클래스가 추가되었을 때 추가되었습니다. IMHO 이것은 이러한 멤버가 함께 컴파일되어 중첩 된 클래스를 더 유용하게 만들기 때문입니다.

참고 : JVM은이 기능을 지원하지 않으므로 컴파일러는 다음과 같은 스택 추적을 나타내는 접근 자 메서드를 추가 access$100합니다. 이들은 클래스 간의 개인 멤버에 대한 액세스를 허용하기 위해 컴파일러에 의해 추가됩니다.


액세스 수정자는 한 수준 만 확인합니다. A가 B와 B에 액세스하고 C에 액세스 할 수 있다면 A는 B가 C가 될 수있는 모든 것에 액세스 할 수 있습니다.

그렇지 않은 이유는 사적인 것을 무의미하게 만드는 것을 피하기 위해서입니다. private멤버가 액세스 할 수있는 클래스에서만 액세스 할 수 있다면 동일한 클래스의 메인에 의해서만 호출 될 수 있음을 의미합니다. 이것은 다른 클래스에서 쓸모 없게 만들 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관