我确实阅读了很多讨论内部类的主题,我的印象是内部类可以访问封闭类的变量和方法。在下面我有一个外部类和一个内部类,在测试类中我创建了一个外部类的实例,然后从中创建了一个内部类的实例。但是我无法通过内部类引用访问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?
}
}
答案 0 :(得分:20)
内部类可以通过自己的方法访问外部类方法和属性。请查看以下代码:
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"
}
}
答案 1 :(得分:5)
看起来你混淆了范围和访问。引用只能访问它们引用的对象的属性和方法。所以你的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.
}
}
答案 2 :(得分:1)
inner
是OuterClass.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;
}
}
答案 3 :(得分:0)
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);
}
}
答案 4 :(得分:0)
System.out.println(inner.a);
您正在尝试读取 a
,就好像它是您内部类的属性,但事实并非如此。您应该定义一个方法来读取外部类的所需属性。所以在你的内部课堂上,你应该有:
public String getA(){
return a;
}
System.out.println(inner.getA());
这应该有用。