我以为内部类可以访问外部类变量/方法?

我确实阅读了许多讨论内部类的主题,我的印象是内部类可以访问封闭类的变量和方法。 在下面我有一个外部类和一​​个内部类,在测试类中我创建了一个外部类的实例,然后从中创建了一个内部类的实例。 但是我无法通过内部类引用访问String变量a。 帮帮我?

public class OuterClass { String a = "A"; String b = "B"; String c = "C"; class InnerClass { int x; } public static class StaticInnerClass { int x; } public String stringConCat() { return a + b + c; } } public class TestStatic { public static void main(String args[]) { OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass(); OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); System.out.println(inner.a);// error here, why can't i access the string // variable a here? } } 

内部类可以通过自己的方法访问外部类方法和属性。 看下面的代码:

 class OuterClass { String a = "A"; String b = "B"; String c = "C"; class InnerClass{ int x; public String getA(){ return a; // access the variable a from outer class } } public static class StaticInnerClass{ int x; } public String stringConCat(){ return a + b + c; } } public class Test{ public static void main(String args[]) { OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass(); OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); System.out.println(inner.getA()); // This will print "A" } } 

看起来你混淆了范围和访问。 引用只能访问它们引用的对象的属性和方法。 所以你的inner.a无法奏效。

另一方面,外部类变量在相应内部类的方法范围内。 因此,您可以通过定义读取访问器来执行您想要的操作。

 public class OuterClass { String a = "A"; String b = "B"; String c = "C"; class InnerClass{ int x; String getA() { return a; } } } public class TestStatic { public static void main(String args[]) { OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass(); OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); System.out.println(inner.getA()); //error should be gone now. } } 

innerOuterClass.InnerClass一个实例,它没有定义a因此它无论如何都无法访问它。

要以最简单的方式理解它…查看创建a的块和定义OuterClass.InnerClass的块。

 public class OuterClass { // a is defined in this block String a = "A"; class InnerClass{ // InnerClass starts here and an instance will access what is defined now int x; } } 

Non-static inner class具有对OuterClass隐式引用 …..

试试吧……

 class OuterClass { String a = "A"; String b = "B"; String c = "C"; class InnerClass { String x = a; // Directly uses the instance variable a from Outer class } public static class StaticInnerClass { int x; } public String stringConCat() { return a + b + c; } } public class TestStatic { public static void main(String args[]) { OuterClass.StaticInnerClass staticClass = new OuterClass.StaticInnerClass(); OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); System.out.println(inner.x); } } 
 System.out.println(inner.a); 

你试图读取 a好像它是你内在类的属性,但事实并非如此。 您应该定义一个方法来读取外部类的所需属性。 所以在你的内心阶层,你应该:

  public String getA(){ return a; } 

 System.out.println(inner.getA()); 

这应该工作。