内部类的访问修饰符
可以在此处找到 Java 中的 Access Modifiers 的完整说明 。但他们如何与内部类互动?
像往常一样,public
可以无限制地访问任何能够访问该类型的范围。
public class OuterClass {
public class InnerClass {
public int x = 5;
}
public InnerClass createInner() {
return new InnerClass();
}
}
public class SomeOtherClass {
public static void main(String[] args) {
int x = new OuterClass().createInner().x; //Direct field access is legal
}
}
protected
和默认修饰符(of nothing)的行为也与预期的一样,与非嵌套类的行为相同。
有趣的是,private
并不局限于它所属的类。相反,它限制了编译单元 - .java 文件。这意味着外部类可以完全访问 Inner 类字段和方法,即使它们被标记为 private
。
public class OuterClass {
public class InnerClass {
private int x;
private void anInnerMethod() {}
}
public InnerClass aMethod() {
InnerClass a = new InnerClass();
a.x = 5; //Legal
a.anInnerMethod(); //Legal
return a;
}
}
内部类本身可以具有除 public
之外的可见性。通过标记 private
或其他受限访问修饰符,将不允许其他(外部)类导入并分配类型。但是,他们仍然可以获得对该类型对象的引用。
public class OuterClass {
private class InnerClass{}
public InnerClass makeInnerClass() {
return new InnerClass();
}
}
public class AnotherClass {
public static void main(String[] args) {
OuterClass o = new OuterClass();
InnerClass x = o.makeInnerClass(); //Illegal, can't find type
OuterClass.InnerClass x = o.makeInnerClass(); //Illegal, InnerClass has visibility private
Object x = o.makeInnerClass(); //Legal
}
}