我在 Bruce Eckel 的 Thinking In Java 4th Edition 的第 128 页有一个问题,第二段,它问的最后一句话:
如果定义的重载构造函数没有初始化
w3
并且在其定义中没有“默认”初始化,会发生什么w3
?
我发现这句话让人难以理解,能否请这本书的专家或读者帮我一点忙?谢谢!
我在 Bruce Eckel 的 Thinking In Java 4th Edition 的第 128 页有一个问题,第二段,它问的最后一句话:
如果定义的重载构造函数没有初始化
w3
并且在其定义中没有“默认”初始化,会发生什么w3
?
我发现这句话让人难以理解,能否请这本书的专家或读者帮我一点忙?谢谢!
Window w3 = new Window(3);
如果有人没有w3
在重载的构造函数中正确初始化,它只是保护。这样的字段实例化会自动放在每个构造函数的开头。所以即使是重载的也会收到w3
初始化。
如果仅声明Window w3
,则在执行重载构造函数时w3
将保留。null
这是书中的代码:
import static net.mindview.util.Print.*;
// When the constructor is called to create a
// Window object, you’ll see a message:
class Window {
Window(int marker)
{
print("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1);
// Before constructor
House() {
// Show that we’re in the constructor:
print("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2);
// After constructor void f() { print("f()"); }
Window w3 = new Window(3);
// At end
}
Java 中的每个字段类型都有一个预定义的默认值,即 null、零或 false,分别适用于所讨论的类型。final
另一方面,如果字段是,则没有默认值,并且在构造时不提供默认值是编译器错误。
- w3
如果它是一个字段(即Instance variable
)
-默认情况下,它将被初始化为null
,因为对象引用变量的默认值为 null。
-现在如果重载的构造函数没有初始化它,它的值将是null
.
我没有这本书,也从未读过它。因此,这只是一个猜测:
w3
是类的成员变量
class A {
public int w3; // w3 has no default initialization
public B() {
w3 = 1; // w3 is initialized here
}
public B(boolean x) {
// w3 is not initialized here
}
}
你可以这样做:
A firstObject = new A();
System.out.println("firstObject.w3 is " + firstObject.w3);
A secondObject = new A(false);
System.out.println("secondObject.w3 is " + secondObject.w3);
你的输出将是
firstObject.w3 is 1
secondObject.w3 is 0
解释:firstObject
是用第一个构造函数创建的,它设置w3
为1
. secondObject
是使用需要boolean
参数的重载构造函数创建的。这个构造函数没有设置 w3,也没有默认的初始化w3
。因此,它永远不会被设置。在 Java 中,对于没有默认初始化的变量,您可以获得以下值:
int/short/byte
:0
long
:0L
double
:0.0d
float
:0.0f
char
:\u0000
boolean
:false
Object
(以及所有派生类):null
final
字段:它们没有默认值,如果没有默认初始化,则抛出编译器错误