java静态最终变量_java – 为什么在本地类中接受静态最终变量?

一般来说,这不是.

但告别是一种特殊的静态最终:一个值为常量,由JLS 15.28定义.这意味着它没有在该位置初始化,这是非静态类(包括本地类)实际上不允许的,如每JLS 8.1.3.

JLS在8.1.3中明确说明(并以粗体显示)(注意“除非”部分):

It is a compile-time error if an inner class declares a member that is explicitly or implicitly static, unless the member is a constant variable (§4.12.4).

如果更改该行以删除最终修饰符或使表达式非常量(例如,new String(“Bye bye”)),那么您将得到预期的编译错误:

Test.java:5: error: Illegal static declaration in inner class EnglishGoodbye

public static final String farewell = new String("Bye bye");

^

modifier 'static' is only allowed in constant variable declarations

1 error

多一点:

允许这样做的原因是编译器特别处理常量变量.特别是,它允许内联它们 – 结果字节码根本没有告别字段!如果您反编译该类(javap -c YourClassName),您将看到如下内容:

public void sayGoodbyeInEnglish();

Code:

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String Bye bye

5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

...

以上对应于这一行:

System.out.println(EnglishGoodbye.farewell);

这有点令人生畏,但请注意“3:”行.程序没有加载字段告别的值,它的加载常量#3(它在注释中注释的是字符串“Bye bye”)(你可以看到字节码on wikipedia的列表).

因为告别是一个常量变量(而不是“真正的”静态成员),因此可以在代码中内联,在定义它的位置并不重要 – 变量的生命周期基本上是整个JVM的生命周期,而不是任何一个类或实例,因此它可以在任何地方声明.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值