为什么java的创建者允许这种情况?我确信必须有一些理由。我的下面的代码允许 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();
}
}
答案 0 :(得分:2)
具有相同外部类的所有类都可以访问同一外部的任何其他类的private
个成员。添加嵌套类时添加了此功能。恕我直言,这是因为这些成员被编译在一起,它使嵌套类更有用。
注意:JVM不支持此功能,因此编译器会添加访问器方法,这些方法显示为access$100
之类的堆栈跟踪。这些是由编译器添加的,以允许访问类之间的私有成员。
访问修饰符仅检查一个级别。如果A可以访问B和B并访问C,那么A可以访问任何B允许它访问的可能是C。
这样做的原因是避免使私人无意义。如果private
成员只能由可以访问它的类访问,则意味着它只能由同一类中的main调用。这将使其在任何其他类中无用。
答案 1 :(得分:1)
来自Java Language Specification:
引用类型的成员(类,接口,字段或方法),或 类型的构造函数,仅在类型为时才可访问 可访问且声明成员或构造函数允许访问:
- ...
- 否则,将成员或构造函数声明为private,并且当且仅当它发生在主体内时才允许访问 顶级类(第7.6节),包含成员或的声明 构造
换句话说,在顶级课程中,private
和protected
不再适用。
至于为什么,如果您认为该类中的所有内容都可以被该类访问,那么它也包括任何内部类中的所有内容!