Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中必须将变量初始化为默认值_Java_Default Value_Variable Initialization - Fatal编程技术网

为什么在Java中必须将变量初始化为默认值

为什么在Java中必须将变量初始化为默认值,java,default-value,variable-initialization,Java,Default Value,Variable Initialization,在一篇关于如何在Java中初始化对象的文章中,有一段如下所示: 在对象生命周期的开始,Java虚拟机(JVM) 在堆上分配足够的内存以容纳对象的 实例变量。然而,当第一次分配内存时 它包含的数据是不可预测的。如果内存按原样使用,则 对象的行为也将是不可预测的。防范 在这种情况下,Java确保在 在被任何代码使用之前,将最小值设置为可预测的默认值 谁能解释一下这里所说的不可预测的数据和不可预测的行为是什么意思。提前感谢,因为如果不初始化变量,JVM将不理解分配什么,它将接受任何值,这将导致不可预测

在一篇关于如何在Java中初始化对象的文章中,有一段如下所示:

在对象生命周期的开始,Java虚拟机(JVM) 在堆上分配足够的内存以容纳对象的 实例变量。然而,当第一次分配内存时 它包含的数据是不可预测的。如果内存按原样使用,则 对象的行为也将是不可预测的。防范 在这种情况下,Java确保在 在被任何代码使用之前,将最小值设置为可预测的默认值


谁能解释一下这里所说的
不可预测的数据
不可预测的行为
是什么意思。提前感谢

,因为如果不初始化变量,JVM将不理解分配什么,它将接受任何值,这将导致不可预测的数据

编译器从不为未初始化的局部变量指定默认值

Java没有未初始化的变量。没有显式初始值设定项的类和对象的字段以及数组元素会自动初始化为其类型的默认值(布尔值为false,所有数值类型为0,所有引用类型为null)。在访问Java中的局部变量之前,必须明确将其赋值,否则这是一个编译错误

有谁能解释一下这里不可预测的数据和不可预测的行为是什么意思

如果您使用C/C++编程,您会注意到未初始化的变量携带一些垃圾值,这些值存在于分配给它的内存位置中,并根据变量的数据类型进行解释。编译器不会抱怨这些变量,如果开发人员忘记正确初始化它们,就会使用垃圾值,从而导致程序的意外行为


在Java中,JVM根据变量的数据类型将所有成员变量初始化为默认值,并抱怨编译期间未初始化的局部变量,为了避免这种意外行为,并使开发人员总是使用初始化变量。

< P>这种不可预测性可以在C或C++中体验,语言在<强> > < /强>自动初始化变量。以下是维基百科的一个例子:

void count( void )
{
    int k, i;
    for (i = 0; i < 10; i++)
    {
        k = k + 1;
    }
    printf("%d", k);
}
void计数(void)
{
int k,i;
对于(i=0;i<10;i++)
{
k=k+1;
}
printf(“%d”,k);
}


我们不知道
k
,因为我们不知道它最初的价值。初始值是已分配内存块中包含的任何值:0x0A4C1330、0x00000000或0x00FF3333等。因此,不可预测的数据会产生(所有类型)不可预测的行为。

在C和其他语言中,编译为本机代码并在非受控环境中运行的未初始化变量可以包含任何随机值。这正是“不可预测”一词的含义。考虑一下指向内存中某个未知位置的指针。如果您的程序错误地开始使用该指针,那么如果该值用于读取,它至少会表现出不可预测的行为,它可能会崩溃,因为例如,如果一个程序将信息写入属于另一个程序的内存区域,则位于该随机内存单元的值的转换无法转换为以代码写入的类型,甚至会导致系统损坏