2

这之间有区别吗:

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

和这个 :

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

如果有,那是什么?什么是更好的做法?如果没有,有什么推荐的?

4

3 回答 3

2

据我所知,只要您只有一个构造函数,就没有区别。如果您有多个构造函数,则需要确保在所有构造函数中都分配了它。出于这个原因,我会推荐第二种方法。

于 2012-04-17T15:33:06.013 回答
1

构造函数在实例变量初始化之后运行,所以有区别。在一个小例子中并不重要,但对于更复杂的代码来说可能很重要。(注意,代码的顺序无关紧要。如果初始化在构造函数中,它会在第二个运行。)

第二种方法更方便,所以我倾向于从它开始。第一种方法可能更有用(对于控制反转和多态性),因此它经常用于“真实”代码中。

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
于 2012-04-17T15:38:34.603 回答
0

他们之间的巨大差异。

在第一个选项中,B 类仅在调用不带参数的构造函数时实例化。如果您放置并调用任何参数化构造函数,B 类将不会实例化。

但是在第二个选项的情况下,无论任何构造函数调用如何,B 类都将始终实例化。

于 2012-04-17T15:38:17.190 回答