2

このコードにはエラーがあります

public class DoIt {
    public static void main(String[] args) {
        final class Apple {
            public static String place = "doIt";
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.place);
            }
        });
        thread.start();
    }
}

エラー-The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression

4

5 に答える 5

1

JLS 8.1.3

内部クラスは、定数変数 (§4.12.4) でない限り、またはコンパイル時エラーが発生しない限り、静的メンバーを宣言できません。

final class Apple {
    public static final String place = "doIt"; // This is good
}

内部クラスはインスタンス クラスです。静的メンバーを使用するポイントは、インスタンス化せずに直接呼び出すことです。したがって、内部クラス内で静的メンバーを許可することはあまり意味がありません。ただし、それらを static- として宣言できます。

static final class Apple {
    public static String place = "doIt";
}
于 2013-09-06T10:56:10.417 に答える
0

Javaチュートリアルによると、

ローカル クラスは、静的メンバーが定数変数である場合に、それらを持つことができます。

したがって、最終的に宣言する必要があります。

    public static void main(String[] args) {
    final class Apple {
        public static final String place = "doIt";
    }
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("");
        }
    });
    thread.start();
}
于 2013-09-06T10:53:29.663 に答える
0

私が推論する前に、エラー用語は次のとおりです

用語:ネストされたクラスは、静的と非静的の 2 つのカテゴリに分けられます。静的と宣言された入れ子になったクラスは、単に静的な入れ子になったクラスと呼ばれます。非静的ネストされたクラスは内部クラス (より具体的にはローカル内部クラス) と呼ばれます。

あなたの場合、ローカルの内部クラスがあります。ドキュメントによると Because an inner class is associated with an instance, it cannot define any static members itself.

内部クラスのインスタンスであるオブジェクトは外部クラスのインスタンス内に存在し、クラスがロードされると静的メンバーがロードされますが、あなたの場合、クラスのロード時にクラスにアクセスして変数Appleをロードする ことはできません。place

また、ローカル クラスは、定数変数である場合に静的メンバーを持つことができます。

あなたができるようにpublic static final String place = "doIt";

于 2013-09-06T10:59:55.687 に答える
0
 final class Apple { {  
     // you can't define non final field inside the final class
     // you have to use final with static

 }

あなたが使用することができます

   public  final static String place = "doIt";
于 2013-09-06T10:46:26.903 に答える