外部类可以访问内部类的成员吗?

内部类是在类中定义的类,内部类可以声明为public,private,protected。 如果内部类定义为private和protected,外层类可以访问内部类的成员吗? 并且内部类可以访问外部类的成员吗?

如果内部类定义为private和protected,外层类可以访问内部类的成员吗?

是。 这些限定符只会影响从外部类派生的类中内部类的可见性。

内部类可以访问外部类的成员吗?

是的,包括那些声明为private ,就像任何实例方法一样。

通常,您可以(访问内部类的私有字段,反之亦然)。 以下代码在Eclipse下编译:

 public class Outer { private int x; public void f() { Inner inner = new Inner(); inner.g(); inner.y = 5; } private class Inner { private int y; public void g() { x = 5; } } } 

也就是说,您可以配置IDE /编译器来处理对错误等字段的访问(在Eclipse中,此设置称为“访问封闭类型的不可访问成员”,在Preferences – > Java – > Compiler – > Error /下)警告 – >代码样式)

是! 您可以从外部类访问内部类成员,反之亦然(与访问修饰符无关)。 但是,对于静态嵌套类,您不能仅通过字段名称访问其字段,并且您需要像访问它一样访问它

 InnerClass.staticInnerField 

虽然您可以直接通过字段名称从内部类访问外部类的静态字段。

“嵌套类是在另一个类中定义的类。嵌套类应该只存在于其封闭类中。如果嵌套类在某些其他上下文中有用,那么它应该是顶级类。有四种类嵌套类:静态成员类,非静态成员类,匿名类和本地类。除了第一种类之外,所有类都被称为内部类。“

(Joshua Bloch,来自Effective Java的书。)

至于你的问题:你很容易自己测试。 但答案是肯定的(即使对于private成员),只要您不试图从静态上下文访问非静态成员(而不是从引用),或尝试访问不可访问范围内的成员。

也就是说,非常像人们期望的那样=)。

解释是在常规内部类的上下文中[常规内部类不能在其中声明静态成员]

您可以直接从内部类访问外部类的任何字段。

 class Outer { private static int x = 0; class Inner { void print() { System.out.println(x); // x can be directly accessed } } public static void main(String[] args) { new Outer().new Inner().print(); } } 

甚至外类也可以通过内部类的对象访问Inner类的任何字段。

 class Outer { private class Inner { private int x = 10; } void print() { Inner inner = new Inner(); System.out.println(inner.x); } public static void main(String[] args) { Outer outer = new Outer(); outer.print(); } }