2014-01-12 85 views
1

这可能是一个“重复”,但我不知道如何寻找这个问题...Java的非静态成员变量初始化

我在声明中初始化非静态成员变量行:

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

我这样做,而不是初始化的默认构造函数内部的变量:

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

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

我得到了两个不同的字节码(即两个不同的'class'文件),这导致我相信可能存在运行时差异。

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

谢谢

回答

1

这种方法有一个小的区别!

当在构造函数中声明变量时,有可能在一段时间后创建第二个构造函数,并且该变量将被初始化。为了打击这一声明这个变量作为最后的 - 这是可能的,当然;)

其他分歧不存在:)

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

使用A a = new A(5);bnull后。

+0

“会创建第二个构造函数”?这到底是什么意思呢? –

+0

@barakmanos样本附 – MariuszS

3

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

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

的功能上的差异可以来在您添加另一个构造的时刻,在这种情况下,即使在该构造函数中,b变量也应该被初始化,否则将会有很大的差异。

在你有变量,不管你有多少构造函数初始化实施首例...

老实说,我不明白你怎么能假装有相同的字节码,写两个不同的东西,作为这个案例 。

+0

但这是一个非静态成员变量。当我创建一个'A'的实例时,这个变量将在构造函数内部或外部被初始化。也许你的意思是差异在于操作的顺序?初始化第一个变量'b',然后调用方法'A()',反之亦然? –

1

没有什么不同(一般来说,声明外部和内部的构造函数会表现不同的东西)。只是提醒一下,初始化外面会先运行,然后再进入一些特定的构造函数。例如:

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

但是,我经常用他们不同的目的:

  1. 初始化内部构造变量使其更清晰,并帮助您初始化更复杂的东西。例如,放置一些逻辑代码,放置一个循环来添加项目,......在构造函数作用域之外进行初始化时,您无法做到这一点。

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

1

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

0

的主要差别是函数的顺序调用:

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

另外一个区别是什么已建议在所有其他的答案...

时不会初始化变量b非默认构造函数存在:

  • 在第1如果使用该构造函数,变量b将被初始化为,甚至
  • 在第二种情况下,变量b而不是在使用该构造函数时被初始化。