在一篇关于如何在Java中初始化对象的文章中,有一段如下:
在对象生命的开始,Java虚拟机(JVM) 在堆上分配足够的内存以容纳对象 实例变量。但是,当首次分配该内存时, 它包含的数据是不可预测的。如果内存按原样使用,那么 对象的行为也是不可预测的。防范 在这种情况下,Java确保内存初始化,at 在被任何代码使用之前,至少是可预测的默认值。
任何人都可以在此处解释unpredictable data
和unpredictable behavior
的含义。提前致谢
答案 0 :(得分:5)
任何人都可以在这里解释不可预测的数据和不可预测的行为的含义。
如果使用C / C ++进行编程,您会注意到未初始化的变量带有一些垃圾值,存在于分配给它的内存位置,根据变量的数据类型进行解释。编译器不会抱怨这些变量,如果开发人员忘记正确初始化它们,则会使用垃圾值,从而导致程序出现意外行为。
在Java中,JVM根据变量的数据类型将所有成员变量初始化为默认值,并抱怨编译期间未初始化的局部变量,以避免此类意外行为并使开发人员始终使用初始化变量。
答案 1 :(得分:4)
因为如果你没有初始化变量,那么JVM将无法理解要分配的内容,它将采用任何会导致不可预测数据的值。
编译器永远不会为未初始化的局部变量分配默认值。
Java没有未初始化的变量。没有显式初始值设定项和数组元素的类和对象的字段将使用其类型的默认值自动初始化(布尔值为false,所有数值类型为0,所有引用类型为null).Java中的局部变量必须为肯定在访问它们之前分配给它,或者它是编译错误。
答案 2 :(得分:4)
这种不可预测性可以在C或C ++中体验,其中语言不自动初始化变量。以下是维基百科的一个例子:
void count( void )
{
int k, i;
for (i = 0; i < 10; i++)
{
k = k + 1;
}
printf("%d", k);
}
http://en.wikipedia.org/wiki/Uninitialized_variable
我们不知道k
,因为我们不知道它最初的价值。初始值是分配的内存块中包含的已经:0x0A4C1330,或0x00000000,或0x00FF3333等。因此,不可预测的数据会产生(各种)不可预测的行为。
答案 3 :(得分:4)
在C和其他编译为本机代码并在非受控环境中运行的语言中,未初始化的变量可以保存任何随机值。这正是“不可预测”一词的含义。想想指向内存中某个未知位置的指针。如果你的程序错误地开始使用这个指针,它至少表现得不可预测,如果这个值用于读取,它可能会崩溃,因为例如位于该随机存储单元的值的转换不能转换为代码写入的类型甚至导致系统损坏如果一个程序将信息写入内存区域属于另一个程序。