內部類的訪問修飾符
可以在此處找到 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
}
}