栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么局部类会接受静态最终变量?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么局部类会接受静态最终变量?

一般而言,不是。

但是

farewell
是一种特殊的静态最终形式:其值是一个常量,如JLS
15.28
所定义。这意味着它没有在该位置被初始化,这是根据JLS
8.1.3
在非静态类(包括本地类)中实际上不允许的。

JLS在8.1.3中明确指出了这一点(并以粗体显示)(请注意“除非”部分):

如果内部类声明一个显式或隐式静态成员,则将导致编译时错误,除非该成员是常量变量(第4.12.4节)。

如果您更改该行以删除

final
修饰符或使表达式非恒定(例如
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 declarations1 error

多一点:

允许这样做的原因是常量变量由编译器专门处理。特别是,可以内联它们-生成的字节码根本没有该

farewell
字段!如果您对类(
javap -cYourClassName
)进行反编译,则会看到以下内容:

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:”行。该程序没有加载该字段的值

farewell
,而是加载了常量3(它在注释中指出是字符串“ Bye
bye”)(您可以在Wikipedia上看到字节码的列表)。

因为

farewell
是一个常量变量(而不是“真正的”静态成员),因此可以内联到代码中,所以在哪里定义它都无所谓-
变量的生命周期本质上是整个JVM的生命周期,而不是任何一个类或实例,因此可以在任何地方声明。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/428755.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号