注意错误信息。这并不是说您没有访问权限。就是说方法不能调用。没有实例的实例方法没有任何意义
打电话给他们。错误消息告诉您的是您没有该实例。
Bloch 告诉您的是,如果该实例存在,内部类中的代码可以在其上调用私有实例方法。
假设我们有以下类:
public class OuterClass {
public void publicInstanceMethod() {}
public static void publicClassMethod() {}
private void privateInstanceMethod() {}
private static void privateClassMethod() {}
}
如果我们尝试从某个随机类中调用这些私有方法,我们不能:
class SomeOtherClass {
void doTheThing() {
OuterClass.publicClassMethod();
OuterClass.privateClassMethod(); // Error: privateClassMethod() has private access in OuterClass
}
void doTheThingWithTheThing(OuterClass oc) {
oc.publicInstanceMethod();
oc.privateInstanceMethod(); // Error: privateInstanceMethod() has private access in OuterClass
}
}
请注意,这些错误消息说私人访问。
如果我们给OuterClass 本身添加一个方法,我们可以调用这些方法:
public class OuterClass {
// ...declarations etc.
private void doAThing() {
publicInstanceMethod(); // OK; same as this.publicInstanceMethod();
privateInstanceMethod(); // OK; same as this.privateInstanceMethod();
publicClassMethod();
privateClassMethod();
}
}
或者如果我们添加一个静态内部类:
public class OuterClass {
// ...declarations etc.
private static class StaticInnerClass {
private void doTheThingWithTheThing(OuterClass oc) {
publicClassMethod(); // OK
privateClassMethod(); // OK, because we're "inside"
oc.publicInstanceMethod(); // OK, because we have an instance
oc.privateInstanceMethod(); // OK, because we have an instance
publicInstanceMethod(); // no instance -> Error: non-static method publicInstanceMethod() cannot be referenced from a static context
privateInstanceMethod(); // no instance -> Error: java: non-static method privateInstanceMethod() cannot be referenced from a static context
}
}
}
如果我们添加一个非静态内部类,看起来我们可以变魔术:
public class OuterClass {
// ...declarations etc.
private class NonStaticInnerClass {
private void doTheThing() {
publicClassMethod(); // OK
privateClassMethod(); // OK
publicInstanceMethod(); // OK
privateInstanceMethod(); // OK
}
}
}
然而,这里有一些诡计:一个非静态内部类总是与外部类的一个实例相关联,而你真正看到的是什么是:
private class NonStaticInnerClass {
private void doTheThing() {
publicClassMethod(); // OK
privateClassMethod(); // OK
OuterClass.this.publicInstanceMethod(); // still OK
OuterClass.this.privateInstanceMethod(); // still OK
}
}
这里,OuterClass.this 是访问该外部实例的特殊语法。但是只有当它模棱两可时才需要它,例如如果外部类和内部类有同名的方法。
还要注意,非静态类仍然可以做静态类可以做的事情:
private class NonStaticInnerClass {
private void doTheThingWithTheThing(OuterClass oc) {
// 'oc' does *not* have to be the same instance as 'OuterClass.this'
oc.publicInstanceMethod();
oc.privateInstanceMethod();
}
}
简而言之:public 和 private 始终与访问有关。 Bloch 的观点是内部类具有其他类没有的访问权限。但是,没有多少访问权限允许您在不告诉编译器您要调用哪个实例的情况下调用实例方法。