是否存在使用默认初始化的情况,例如:
int myValue;
或者
MyObject o = null;
与我根本不初始化变量的情况相比,可以改变我的程序的行为吗?
我正在寻找一个例子。
是否存在使用默认初始化的情况,例如:
int myValue;
或者
MyObject o = null;
与我根本不初始化变量的情况相比,可以改变我的程序的行为吗?
我正在寻找一个例子。
局部变量必须在使用前进行初始化。这是由编译器强制执行的。
字段默认初始化为与其类型关联的默认值(false、0、null)。这是 Java 语言规范所要求的。
因此,在大多数情况下,将它们显式初始化为默认值只会增加噪音:
MyObject o = null;
什么都不做
MyObject o;
是的,可能会有所不同,如本例所示。这有点做作,但归结为初始化发生的时间。
考虑以下类:
import java.lang.reflect.Field;
public class base {
protected base(int arg) throws Exception {
Field f = getClass().getDeclaredField("val");
System.out.println(f.get(this));
f.set(this, 666);
}
}
以及以下两个扩展它的类。test1
显式设置为 0:
public class test1 extends base {
int val=0; // Explicitly set to 0
public test1() throws Exception {
super(0);
}
public static void main(String argv[]) throws Exception {
System.out.println(new test1().val);
}
}
test2
就离开它:
public class test2 extends base {
int val; // just leave it to be default
public test2() throws Exception {
super(0);
}
public static void main(String argv[]) throws Exception {
System.out.println(new test2().val);
}
}
运行这些给出:
javac test1.java && java test1
0
0
但是对于第二种情况:
javac test2.java && java test2
0
666
这巧妙地说明了一种不同的行为,唯一的变化是= 0
for 字段。
拆开第一种情况可以看出原因:
import java.io.PrintStream;
public synchronized class test1 extends base
{
int val;
public test1()
throws Exception
{
super(0);
val = 0; // Note that the the explicit '= 0' is after the super()
}
public static void main(String astring[])
throws Exception
{
System.out.println(new test1().val);
}
}
如果这对您的代码库产生了影响,那么您需要担心更大的事情!
在 Java 中,类的实例和静态成员字段被分配了一个默认值:原语默认为 0,对象为 null,布尔值为 false。
但是,Java 要求您先为在方法范围内声明的局部变量赋值,然后才能使用它们。此类变量没有默认值。
据我了解,没有这种情况。Java规范要求变量默认按照以下规则进行初始化:
数字:0 或 0.0
布尔值:false
对象引用:null
只要您在编程时牢记这些规则,显式初始化为与上述相同的值不会改变程序的行为。