gpt4 book ai didi

java - Java Final 变量会有默认值吗?

转载 作者:IT老高 更新时间:2023-10-28 11:47:05 24 4
gpt4 key购买 nike

我有一个这样的程序:

class Test {

final int x;

{
printX();
}

Test() {
System.out.println("const called");
}

void printX() {
System.out.println("Here x is " + x);
}

public static void main(String[] args) {
Test t = new Test();
}

}

如果我尝试执行它,我会收到编译器错误:variable x may not have been initialized 基于 java 默认值我应该得到以下输出正确吗??

"Here x is 0".

final 变量会有默认值吗?

如果我像这样更改我的代码,

class Test {

final int x;

{
printX();
x = 7;
printX();
}

Test() {
System.out.println("const called");
}

void printX() {
System.out.println("Here x is " + x);
}

public static void main(String[] args) {
Test t = new Test();
}

}

我得到的输出是:

Here x is 0                                                                                      
Here x is 7
const called

谁能解释一下这种行为..

最佳答案

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html ,“初始化实例成员”一章:

The Java compiler copies initializer blocks into every constructor.

也就是说:

{
printX();
}

Test() {
System.out.println("const called");
}

表现完全一样:

Test() {
printX();
System.out.println("const called");
}

如您所见,一旦创建了实例,最终字段就不是 definitely assigned ,而(来自 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.2 ):

A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared; otherwise a compile-time error occurs.

虽然在文档中似乎没有明确说明(至少我没能找到它),但最终字段必须在构造函数结束之前临时取其默认值,以便它具有 predictable value如果您在分配之前阅读它。

默认值:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5

在您的第二个片段中, x 在实例创建时被初始化,因此编译器不会提示:

Test() {
printX();
x = 7;
printX();
System.out.println("const called");
}

另请注意,以下方法不起作用。只能通过方法使用 final 变量的默认值。

Test() {
System.out.println("Here x is " + x); // Compile time error : variable 'x' might not be initialized
x = 7;
System.out.println("Here x is " + x);
System.out.println("const called");
}

关于java - Java Final 变量会有默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24990691/

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