有没有这样的情况,使用默认初始化,比如:
int myValue;
或者
MyObject o = null;
如果我不初始化变量,与我初始化变量的情况相比,会改变程序的行为吗?
我正在寻找一个示例。
有没有这样的情况,使用默认初始化,比如:
int myValue;
或者
MyObject o = null;
如果我不初始化变量,与我初始化变量的情况相比,会改变程序的行为吗?
我正在寻找一个示例。
MyObject o = null;
不做任何超出
MyObject o;
int val = 0;
生成的字节码作为字段的长度与 int val;
不同,因此似乎存在某些差异。 - Flexoa = 1; a = 1; a = 1;
等同于执行 a = 1;
。 - JB Nizet当初始化发生的时间不同时,就会出现差异,例如以下示例。这有点牵强,但问题在于初始化发生的时间。
考虑以下类:
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
。原因可以通过反汇编第一个案例来看到: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);
}
}
public class Main {
abstract static class Base implements Runnable {
protected Base() {
run();
}
}
static class DerivedExplicitDefault extends Base {
int val = 0;
public void run() {
val = 666;
}
}
static class DerivedImplicitDefault extends Base {
int val;
public void run() {
val = 666;
}
}
public static void main(String argv[]) throws Exception {
System.out.println(new DerivedExplicitDefault().val);
System.out.println(new DerivedImplicitDefault().val);
}
}
- Tim Carson只要你按照这些规则编程,显式地初始化为上述相同的值不会改变程序的行为。数字:0或0.0
布尔值:false
对象引用:null