5
public class Application {
    public static void main(String[] args) {
        final class Constants {
            public static String name = "globe";
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.name);
            }
        });
        thread.start();
    }
}

编译错误:The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression

解决这个问题?

4

2 回答 2

8

Java 不允许您在函数局部内部类中定义非最终静态字段。只允许顶级类和静态嵌套类具有非最终静态字段。

如果你想要你的类中的一个static字段Constants,把它放在Application类级别,像这样:

public class Application {
    static final class Constants {
        public static String name = "globe";
    }
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.name);
            }
        });
        thread.start();
    }
}
于 2013-08-30T06:10:13.687 回答
6

JLS 部分 8.1.3

内部类不能声明静态成员,除非它们是常量变量(第 4.12.4 节),或者发生编译时错误。

因此,如果您只制作变量就可以了final

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

当然,如果您需要使用非常量值对其进行初始化,这将不起作用。

说了这么多,这是一个不寻常的设计,IMO。根据我的经验,很少见到有名字的本地班级。您需要这是本地课程吗?你想达到什么目的?

于 2013-08-30T06:18:33.547 回答