在构造函数中调用未初始化的变量

时间:2012-05-31 09:15:33

标签: java

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

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

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

输出是 五 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); 
}

}

5 个答案:

答案 0 :(得分:3)

基元初始化为默认值,在本例中,0表示整数,0.0表示浮点数或双精度数。对象默认为null,例如String为null。

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

默认初始值是语言功能,根本不需要构造函数。

您在此处了解默认值:http://www.janeg.ca/scjp/lang/defaults.html

请记住,默认值仅适用于CLASS成员,而不适用于本地变量。这种差异就是为什么你得到一些未被初始化的值的编译错误。

答案 1 :(得分: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

答案 2 :(得分:0)

简单数据类型不能为null(类型为int或double),只有对象可以为null。这些数值简单数据类型的默认值始终为0.因此,如果不初始化双值,则总是得到0.0 如果要使用对象,请使用包装类Integer或Double

答案 3 :(得分:0)

本地变量和其他所有规则都有所不同。从根本上说,差异在于堆栈分配和堆分配。堆栈上分配的所有内存(以及所有实例和类变量)在代码有机会观察它之前会被清零,这与堆栈帧不同。因此,Java通过静态分析确保您的代码在初始化之前无法读取本地var,但是对于堆分配的var没有这样的检查,它总是具有一致的值(不管是否为类型的零字节的解释) quetion - 零数字,假布尔值,null-refs)。

答案 4 :(得分:0)

记住这一点,

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

char = \ u0000

double = 0.0

对象引用变量= null;

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