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

17

我已经阅读了一些关于内部类的话题,我的印象是内部类可以访问封闭类的变量和方法。下面有一个外部类和一个内部类,在测试类中我创建了一个外部类的实例,然后从那里创建了一个内部类的实例。但是我无法通过内部类引用访问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?

    }
}
5个回答

23
内部类可以通过自己的方法访问外部类的方法和属性。看下面的代码:
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"
    }
}

6
啊!我现在明白了。内部类可以在其类声明内访问外部类的字段。但是,您不能创建内部类的实例并期望该内部类引用可以访问外部类的字段。这正确吗? - rage
1
是的,你说得对!内部类可以在其方法中访问外部类的属性/方法。请注意,内部类甚至可以访问外部类的私有属性和方法。 - Sandeep Panda
谢谢,@SandeepPanda。我将我的类声明为私有的,现在我已经将其更改为公共的,并按照您的方法访问内部类,它起作用了。 - amit pandya

6

看起来你把范围和访问混淆了。 引用只能访问它们所引用的对象的属性和方法。 所以你的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.   

    }  
}

1

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;
    }
}

那么,内部类只能访问其自身类声明中定义的变量/方法? - rage
当说内部类可以访问外部类的所有变量/方法时,这意味着什么?抱歉,我还有点困惑。编辑:没关系,我现在理解了! - rage

0

非静态内部类具有对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);

    }
}

0
System.out.println(inner.a);

您正在尝试将a作为内部类的属性进行读取,但实际上它不是。您应该定义一个方法来读取外部类的所需属性。因此,在您的内部类中,您应该有:

 public String getA(){
     return a;
 }

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

这应该可以运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接