我在第128页的Bruce Eckel的Thinking In Java第4版中提出了一个问题,第二段,它问的最后一句:
如果定义的重载构造函数未初始化
w3
并且其定义中没有w3
的“默认”初始化,会发生什么?
我发现这句话让人难以理解,本书的专家或读者可以帮我一点吗?谢谢!
答案 0 :(得分:1)
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
}
答案 1 :(得分:0)
Java中的每个字段类型都有一个预定义的默认值,分别为null,零或false,适用于相关类型。另一方面,如果某个字段为final
,则没有默认值,并且编译错误是不在构造时提供一个。
答案 2 :(得分:0)
- w3
如果是一个字段(即Instance variable
)
- 默认情况下,它将初始化为null
,作为对象引用变量的默认值为空。
- 现在,如果重载的构造函数未初始化,则其值为null
。
答案 3 :(得分:0)
我没有这本书,也没有读过它。因此,这只是猜测:
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
字段:如果没有默认初始化,它们没有默认值并抛出编译器错误