类为什么实例变量在java中有默认值?
为什么类中声明的变量有默认值,而方法中声明的变量(称为“局部变量”)在Java中没有默认值
比如
class abc
{
int a;
public static void main(String ss[])
{
int b;
abc aa=new abc();
System.out.println(aa.a);
System.out.println(b);
}
}
在上面的示例中,变量a
的默认值为0,但变量b
给出的错误是它可能尚未初始化
# 1 楼答案
局部变量初始化
在方法和块中声明的变量称为局部变量。局部变量在方法调用时创建时未初始化。因此,局部变量在使用之前必须显式初始化。否则,在执行包含方法或块时,编译器会将其标记为错误
示例:
编译器抱怨println语句(1)中使用的局部变量total可能未初始化。 在使用前初始化局部变量total可以解决此问题:
字段初始化
如果在声明或初始化程序块中没有为实例或静态变量提供初始化,则它将使用其类型的默认值进行隐式初始化。 每次实例化类时,实例变量都会用其类型的默认值初始化,,即针对从该类创建的每个对象。 在第一次加载类时,静态变量将使用其类型的默认值初始化
# 2 楼答案
tl;博士:这或多或少是一个随意的选择
如果你问我,Java为实例变量设置默认值是一个错误。编译器应该在编译之前强制程序员对其进行初始化,就像局部变量一样
默认值背后的基本原理是安全。当一个对象被实例化时,将为该对象分配一块内存,该对象包含实例变量指向的位置等。Java设计人员决定用零和空清除这部分内存是个好主意。这样,您就永远不会读取在分配对象之前碰巧存在的垃圾。他们本可以强制初始化;这个选择没有什么根本的意义。它可能使事情易于实现,并且对Java的设计者来说有足够的意义
对于局部变量,设计者选择强制初始化(或者更准确地说,当仅声明局部变量时,他们选择不进行任何类型的初始化,因此编译器最合乎逻辑的行为是在使用前强制初始化变量)