这之间有区别吗:
public class A {
B b;
A() {
b=new B();
}
}
和这个 :
public class A {
B b=new B();
A() {
}
}
如果有,那是什么?什么是更好的做法?如果没有,有什么推荐的?
这之间有区别吗:
public class A {
B b;
A() {
b=new B();
}
}
和这个 :
public class A {
B b=new B();
A() {
}
}
如果有,那是什么?什么是更好的做法?如果没有,有什么推荐的?
据我所知,只要您只有一个构造函数,就没有区别。如果您有多个构造函数,则需要确保在所有构造函数中都分配了它。出于这个原因,我会推荐第二种方法。
构造函数在实例变量初始化之后运行,所以有区别。在一个小例子中并不重要,但对于更复杂的代码来说可能很重要。(注意,代码的顺序无关紧要。如果初始化在构造函数中,它会在第二个运行。)
第二种方法更方便,所以我倾向于从它开始。第一种方法可能更有用(对于控制反转和多态性),因此它经常用于“真实”代码中。
class B {
B() {
System.out.println("B constructor");
}
}
public class A {
B b=new B();
A() {
System.out.println("A constructor");
}
public static void main(String[] args) {
new A();
}
}
输出:
B constructor
A constructor
……
class B {
B() {
System.out.println("B constructor");
}
}
public class A {
B b;
A() {
System.out.println("A constructor");
b=new B();
}
public static void main(String[] args) {
new A();
}
}
输出:
A constructor
B constructor
他们之间的巨大差异。
在第一个选项中,B 类仅在调用不带参数的构造函数时实例化。如果您放置并调用任何参数化构造函数,B 类将不会实例化。
但是在第二个选项的情况下,无论任何构造函数调用如何,B 类都将始终实例化。