1

在下面的构造函数中,我只初始化了两个变量,而一些变量未显式初始化。

正如我所读到的,如果构造函数是由我们提供的,编译器不会创建参数构造函数。那么在这种情况下,由于我有自己的构造函数,所以没有初始化变量 p 和 q 的默认构造函数。

所以,逻辑应该是如果我们尝试访问那些未初始化的变量,那么它应该是编译时错误。但是,下面的代码运行成功。

输出为 5 10 0.0 0.0

我们如何解释输出 0.0 和 0.0 因为我没有在构造函数中声明它们?

public class Rectangle {
int l, b;
double p, q;

public Rectangle(int x, int y) {
l = x;
b = y;
}

public static void main(String[] args) {
    Rectangle obj1= new Rectangle(5,10);
    System.out.println(obj1.l);
    System.out.println(obj1.b);
    System.out.println(obj1.p);
    System.out.println(obj1.q); 
}

}

4

5 回答 5

4

基元被初始化为默认值,在这种情况下,0 表示整数,0.0 表示浮点数或双精度数。对象默认为空,例如字符串为空。

您在构造函数中设置的值通常与默认值不同,因此需要构造函数。

默认初始值是一种语言特性,根本不需要构造函数。

您在此处阅读了有关默认值的信息:http ://www.janeg.ca/scjp/lang/defaults.html

请记住,默认值仅适用于 CLASS 成员,而不适用于局部变量。这种差异就是为什么某些未初始化的值会出现编译错误的原因。

于 2012-05-31T09:17:24.743 回答
0

默认情况下,java 将 double 初始化为 0.0

这是因为 double 是一种原始数据类型,不能是 null引用

来自java文档:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Data Type   Default Value (for fields)
 byte                  0
 short                 0 
 int                   0
 long                  0L
 float                 0.0f
 double               0.0d
 char                 '\u0000'
 String (or any object)     null
 boolean                   false
于 2012-05-31T09:16:36.977 回答
0

简单数据类型不能为空(类型如 int 或 double),只有对象可以为空。这些数字简单数据类型的默认值始终为 0。因此,如果您不初始化您的双精度值,您将始终获得 0.0,如果您想使用对象,请使用包装类 Integer 或 Double

于 2012-05-31T09:18:53.620 回答
0

对于局部变量和其他一切,规则是不同的。从根本上说,堆栈分配和堆分配之间的区别。与堆栈帧不同,在您的代码有机会观察它之前,在堆上分配的所有内存(以及所有实例和类变量)都被清零。因此,Java 通过静态分析确保您的代码在初始化之前无法读取本地 var,但是对于堆分配的 var 没有这样的检查,它将始终具有一致的值(无论是问题——零数字、假布尔值、空引用)。

于 2012-05-31T09:21:41.520 回答
0

记住这一点,

在 Java 中,实例变量默认初始化为它们各自的默认值。这就是您的未初始化值是 0.0 的原因(因为它们的数据类型是双精度的)

字符 = \u0000

双 = 0.0

对象引用变量 = null;

但是在Java 中,局部变量(即方法内部)必须在使用之前进行初始化。这必须由程序员完成。

于 2012-05-31T09:24:03.903 回答