17

私は内部クラスについて議論している多くのトピックを読みましたが、内部クラスは囲んでいるクラスの変数とメソッドにアクセスできるという印象を受けました。次の例では、外部クラスと内部クラスがあり、テスト クラスで外部クラスのインスタンスを作成し、そこから内部クラスのインスタンスを作成します。ただし、内部クラス参照を介して文字列変数 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?

    }
}
4

5 に答える 5

22

内部クラスは、独自のメソッドを介して外部クラスのメソッドとプロパティにアクセスできます。次のコードを見てください。

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"
    }
}
于 2012-09-03T17:31:38.320 に答える
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.   

    }  
}
于 2012-09-03T17:32:00.790 に答える
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;
    }
}
于 2012-09-03T17:24:45.823 に答える
0
System.out.println(inner.a);

内部クラスのプロパティであるかのように読み取ろ うとしていますが、そうではありません。a外部クラスの目的のプロパティを読み取るメソッドを定義する必要があります。したがって、内部クラスには次のものが必要です。

 public String getA(){
     return a;
 }

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

これはうまくいくはずです。

于 2012-09-03T17:39:25.893 に答える
0

Anには.....への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);

    }
}
于 2012-09-03T17:32:12.800 に答える