在下面的构造函数中,我只初始化了两个变量,使一些变量显式未初始化。
正如我所读到的,如果构造函数是由我们提供的,编译器不会创建参数构造函数。那么在这种情况下,因为我有自己的构造函数所以没有默认构造函数初始化变量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);
}
}
答案 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中,必须在使用之前初始化局部变量(即方法内部)。这必须由程序员完成。