gpt4 book ai didi

方法局部类中的 Java 最终静态声明

转载 作者:太空狗 更新时间:2023-10-29 22:44:55 25 4
gpt4 key购买 nike

在方法内部声明局部内部类时,为什么包含最终静态字符串或整数是合法的,但包含其他对象是不合法的?

例如:

class Outer {
void aMethod() {
class Inner {
final static String name = "compiles";
final static int ctr = 10; // compiles
final static Integer intThree = Integer.valueOf(3); // does not compile!
final static obj objConst = new Object(); // does not compile!
}

Inner inner = new Inner();
}
}

当我编译它时,我得到以下信息:

InnerExample.java:6: inner classes cannot have static declarations
final static Integer outer = Integer.valueOf(3);
^
InnerExample.java:7: inner classes cannot have static declarations
final static Object objConst = new Object();
^

为什么要区分?是因为 String 是不可变的吗?如果是这样,难道 Integer.valueOf() 不是也有效吗?

最佳答案

因为前两个静态成员被赋值给原始类型或String类型的编译期常量。

来自Java Language Specification, section 8.1.3 :

8.1.3. Inner Classes and Enclosing Instances

Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.

来自4.12.4 :

A variable of primitive type or type String, that is final and initialized with a compile-time constant expression (§15.28), is called a constant variable.

编辑:

一开始我觉得这很奇怪。多想想,这个限制的一个好处是不用担心内部类的静态成员什么时候初始化。您可以在其包含类中移动内部类,而不必担心其静态成员的值会被更改。

关于方法局部类中的 Java 最终静态声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com