內部類的訪問修飾符

可以在此處找到 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
    }
}