错误:字段名不能声明为静态。

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();
    }
}

编译错误:在非静态内部类型中声明名称不能是静态的,除非使用常量表达式进行初始化 解决方法?

你尝试过将“Constants”设置为静态类型吗? - MD Sayem Ahmed
不要在常量中声明字符串,也不要将常量类声明为final和static(可能也不要在main方法内部声明)。 - Matthias
2个回答

8

在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();
    }
}

2
你的第一句话是错误的 - 如果在原始代码中将字段声明为final,它将会编译通过,因为它被初始化为一个常量值。 - Jon Skeet
现在变量 name 应该声明为 final - Pramod Ravikant
1
@micro.pravi:如果你将其设为“final”,你可以再次将“Constants”设置为本地类。 - Jon Skeet

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();
    }
}

当然,如果您需要使用非常量值进行初始化,则此方法将无法运行。
说了这么多,我认为这是一种不寻常的设计。在我的经验中,很少见到命名的本地类。您是否需要这个作为本地类?你想要实现什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接