자바 제작자가이 상황을 허용 한 이유는 무엇입니까? 나는 그것에 대한 어떤 이유가있을 것이라고 확신합니다. 아래 코드를 사용하면 Lion 이 Cheetah 만큼 빠르게 장난스럽게 실행할 수 있습니다 .
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] 삭제
몇 마디 만하겠습니다