Java实例变量初始化内外构造函数混淆

时间:2014-01-15 04:50:52

标签: java

让我们看一小段java代码

class Foo {
  int i = 0;
  int j;
  public Foo(int j){
     this.j = j;
  }
}

上面的例子展示了两种在Java中初始化变量的方法。但我的问题是哪个变量首先被初始化?构造函数外部的变量或构造函数内部的变量? 当我实例化上面的类Foo foo = new Foo(5)时,我知道类的构造函数被调用,这意味着变量j首先被初始化。任何人都可以让我明确订购。

5 个答案:

答案 0 :(得分:3)

优先级

在您的情况下,int j首先发生,默认为0,然后在调用构造函数创建新实例时重新分配给5

j仅在构造函数运行时重新分配。当您在构造函数之外分配它们时,实例成员首先被初始化。

执行顺序

每行代码按其出现的顺序执行。声明始终在构造函数之前按照它们在代码中列出的顺序发生。

确定性和可预测

您应该只在单个构造函数内的单个位置初始化实例成员。

依赖于默认值会导致难以追踪错误,并使测试成为一场噩梦,但未分配的实例成员会像对IDE,编译器和运行时的大拇指一样突出。不幸的是,对于像int这样的原语,它们默认为0,这可能不是您想要/需要的。

更好的设计是:

 private final int j;

 public Foo(final int j) { this.j = j; }

这使得j无法在初始化时分配任何内容,您永远不必担心它会发生变化。

答案 1 :(得分:2)

假设你有这个课程

public class Test
{
    int i = 4;

    public Test()
    {
        System.out.println(i);
    }  
}

创建Test的实例时,输出将为4。这意味着首先进行初始化。然后调用构造函数。因为如果构造函数是第一个并且初始化i秒,则不会将4作为输出。

答案 2 :(得分:0)

int i = 0;

我是一个实例变量,因此会得到默认值0.因此,您不需要明确地为其指定0。

来到你的问题

 But my question is which variable first get initialized?

然后答案是我在j之前初始化。因为如果您看到首先创建了代码段对象的字节代码,它将初始化您的实例变量,然后调用构造函数。

答案 3 :(得分:0)

当你创建对象创建时,首先要做变量声明。之后只定义变量。在你的情况下,第一个“j”变量将首先声明为类变量。之后,该值将在类的构造函数中指定为“j”。

答案 4 :(得分:0)

订购: -

  1. 首先执行静态初始化块。(如果有的话)
  2. 然后从main方法开始执行。
  3. 对于您的问题,我认为ij将会被初始化 i=0;并且j为0(默认值为int。)

    因为在构造函数中,您只是更改了值。