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

rag*_*age 15 java

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

    }
}
Run Code Online (Sandbox Code Playgroud)

San*_*nda 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 啊! 我想我现在明白了.内部类可以访问其类声明的外部类INSIDE中的字段.但是,您无法创建内部类的实例,并期望内部类引用可以访问外部类字段.它是否正确? (6认同)

Gen*_*ene 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.   

    }  
}
Run Code Online (Sandbox Code Playgroud)