这可能是“重复”,但我不确定如何搜索这个问题...
我正在申报行初始化一个非静态成员变量:
public class A
{
private B b = new B();
...
}
我这样做而不是在默认构造函数中初始化此变量:
public class A
{
private B b;
public A()
{
b = new B();
}
...
}
两者之间是否有任何区别,除了(可能)前者不是“ANSI Java”之类的东西?
我为上述两种实现获得了两个不同的字节代码(即两个不同的“类”文件),这使我相信可能存在运行时差异。
所以我想知道我是否有任何理由期望在运行时期间有任何不同。
由于
答案 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);
字段b
后null
。
答案 2 :(得分:1)
一般没有什么不同(意味着在构造函数的外部和内部声明会表现出不同的东西)。只是提醒一下,在进入某个特定的构造函数之前,将首先运行initialize。例如:
class A {
int a = 3;
public A() {
a = 4; // now a = 4. not 3
}
}
但是,我经常以不同的目的使用它们:
在构造函数中初始化变量使其更清晰,并帮助您初始化更复杂的东西。例如,放置一些逻辑代码,添加一个循环来添加项目,......在构造函数范围之外初始化时你不能做。
当你有许多重载构造函数时,一些变量总是声明相同。简单的“状态变量”,例如isExist
isEmpty
...我经常在构造函数范围之外初始化。所以,所有其他构造函数都不会做同样的事情。
答案 3 :(得分:1)
没有区别,两个代码都运行良好。我个人更喜欢大班的第二种方式,同时第一种方式更喜欢小班。
答案 4 :(得分:0)
主要区别在于函数调用的顺序:
B()
之前调用方法A()
。A()
之前调用方法B()
。另一个不同之处在于所有其他答案中的建议......
当存在未初始化变量b
的非默认构造函数时:
b
将被初始化甚至。b
将不初始化。