Java非静态成员变量初始化

时间:2014-01-12 17:10:40

标签: java constructor member-variables

这可能是“重复”,但我不确定如何搜索这个问题...

我正在申报行初始化一个非静态成员变量:

public class A
{
    private B b = new B();
    ...
}

我这样做而不是在默认构造函数中初始化此变量:

public class A
{
    private B b;
    public A()
    {
        b = new B();
    }
    ...
}

两者之间是否有任何区别,除了(可能)前者不是“ANSI Java”之类的东西?

我为上述两种实现获得了两个不同的字节代码(即两个不同的“类”文件),这使我相信可能存在运行时差异。

所以我想知道我是否有任何理由期望在运行时期间有任何不同。

由于

5 个答案:

答案 0 :(得分:3)

第一个是同时声明和初始化。

在第二个例子中,你没有初始化b变量的声明,然后在构造函数中初始化变量......

当你添加另一个构造函数时,函数差异就会出现,在这种情况下,即使在那个构造函数中也应该初始化b变量,否则会有很大的差异。

在第一种情况下,无论你实现多少构造函数,都要初始化变量......

老实说我不明白你怎么能假装拥有相同的字节码,为这种情况编写两个不同的东西。

答案 1 :(得分:1)

这种方法之间存在一个小差异!

当变量在构造函数中声明时,有可能在一段时间之后创建第二个构造函数,并且此变量将是未初始化的。为了战斗,这个变量声明为final - 如果这是可能的话;)

其他差异不存在:)

public class A
{
    private B b;
    public A() {
        b = new B();
    }
    public A(int value) { // second constructor
    }
    ...
}

使用A a = new A(5);字段bnull

答案 2 :(得分:1)

一般没有什么不同(意味着在构造函数的外部和内部声明会表现出不同的东西)。只是提醒一下,在进入某个特定的构造函数之前,将首先运行initialize。例如:

class A {
  int a = 3;
  public A() {
     a = 4;  // now a = 4. not 3
  }
}

但是,我经常以不同的目的使用它们:

  1. 在构造函数中初始化变量使其更清晰,并帮助您初始化更复杂的东西。例如,放置一些逻辑代码,添加一个循环来添加项目,......在构造函数范围之外初始化时你不能做。

  2. 当你有许多重载构造函数时,一些变量总是声明相同。简单的“状态变量”,例如isExist isEmpty ...我经常在构造函数范围之外初始化。所以,所有其他构造函数都不会做同样的事情。

答案 3 :(得分:1)

没有区别,两个代码都运行良好。我个人更喜欢大班的第二种方式,同时第一种方式更喜欢小班。

答案 4 :(得分:0)

主要区别在于函数调用的顺序:

  • 在第一种情况下,在方法B()之前调用方法A()
  • 在第二种情况下,在方法A()之前调用方法B()

另一个不同之处在于所有其他答案中的建议......

当存在未初始化变量b的非默认构造函数时:

  • 在第一种情况下,当使用该构造函数时,变量b将被初始化甚至
  • 在第二种情况下,只要使用该构造函数,变量b初始化。