【问题标题】:Error: field name cannot be declared static错误:字段名称不能声明为静态
【发布时间】:2013-08-30 06:07:59
【问题描述】:
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

解决办法?

【问题讨论】:

  • 您是否尝试将Constants 设为静态类型?
  • 不在常量中声明字符串或使最终类常量也是静态的(并且可能不在主方法中声明它)。

标签: java multithreading static inner-classes


【解决方案1】:

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

如果您想在 Constants 类中使用 static 字段,请将其放在 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();
    }
}

【讨论】:

  • 您的第一句话不正确 - 如果在原始代码中将字段设为 final,它将编译,因为它是用常量值初始化的。
  • 现在变量name应该声明final
  • @micro.pravi: 如果你把它改成final,你可以把Constants 再改成一个本地类..
【解决方案2】:

来自JLS section 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。根据我的经验,很少看到有名字的本地课程。你需要这是一个本地类吗?你想达到什么目的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2014-05-12
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多