4

Java では、匿名クラス内で新しいフィールドを宣言できますが、外部からそれらにアクセスする方法がわかりません。パブリックに設定してもできません。

class A {
   public static void main(String[] args) {
       Object o = new Object() {
           public int x = 0;
           {
               System.out.println("x: " + x++);
               System.out.println("x: " + x++);
           }
       };
       System.out.println(o.x);
   }
}

次のコンパイラ エラーが発生します。

$ javac A.java && java A
A.java:10: cannot find symbol
symbol  : variable x
location: class java.lang.Object
       System.out.println(o.x);
                           ^
1 error

なんで?

4

6 に答える 6

3

あなたはそれを反省することによってのみ行うことができました。クラスには名前がないため、変数oを として宣言する必要があり、そのメンバーはObjectありObjectません。つまり、これをしないでください。

于 2013-05-10T20:05:51.613 に答える
1

リフレクションによってフィールドにアクセスできます。

    Object o = new Object() {
       public int x = 0;
       {
           System.out.println("x: " + x++);
           System.out.println("x: " + x++);
       }
   };
   System.out.println(o.getClass().getField("x").get(o));

より良いスタイルは、フィールドにアクセスする場合は、クラスに名前を付けて変数タイプとして使用することです。

    class MyObject {
       public int x = 0;
       {
           System.out.println("x: " + x++);
           System.out.println("x: " + x++);
       }
   }
   MyObject o = new MyObject();
   System.out.println(o.x);
于 2013-05-10T20:44:48.313 に答える
0

拡張する内部クラスを定義Objectします(特定のケースextends Objectでは、とにかく行われるように記述しないでください。クラスでは、フィールドを定義し、タイプの参照によってそれらにアクセスします。

例:

void func() {
     class MyInt extends Integer {
         boolean isSane = true;
     }
     MyInt intInstance = new MyInt();
     if (intInstance .isSane) {
         System.out.println("sane integer");
     }
}
于 2014-03-04T16:35:11.703 に答える