请注意错误消息。这并不是说您没有访问权限。它说不能调用该方法。实例方法没有任何意义,没有实例来调用它们。错误消息告诉您的是,您没有该实例。
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