内部类的访问修饰符

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