4

是否存在使用默认初始化的情况,例如:

int myValue;

或者

MyObject o = null;

与我根本不初始化变量的情况相比,可以改变我的程序的行为吗?

我正在寻找一个例子。

4

4 回答 4

8

局部变量必须在使用前进行初始化。这是由编译器强制执行的。

字段默认初始化为与其类型关联的默认值(false、0、null)。这是 Java 语言规范所要求的。

因此,在大多数情况下,将它们显式初始化为默认值只会增加噪音:

MyObject o = null;

什么都不做

MyObject o;
于 2012-09-17T14:42:03.863 回答
2

是的,可能会有所不同,如本例所示。这有点做作,但归结为初始化发生的时间。

考虑以下类:

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

这巧妙地说明了一种不同的行为,唯一的变化是= 0for 字段。

拆开第一种情况可以看出原因:

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);
    }
}

如果这对您的代码库产生了影响,那么您需要担心更大的事情!

于 2012-09-17T15:12:34.970 回答
1

在 Java 中,类的实例和静态成员字段被分配了一个默认值:原语默认为 0,对象为 null,布尔值为 false。

但是,Java 要求您先为在方法范围内声明的局部变量赋值,然后才能使用它们。此类变量没有默认值。

于 2012-09-17T14:43:20.573 回答
0

据我了解,没有这种情况。Java规范要求变量默认按照以下规则进行初始化:

数字:0 或 0.0
布尔值:false
对象引用:null

只要您在编程时牢记这些规则,显式初始化为与上述相同的值不会改变程序的行为。

于 2012-09-17T14:42:30.810 回答