在声明中分配或在构造函数中分配?

时间:2012-04-17 15:28:40

标签: java constructor

这是否有区别:

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

和此:

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

答案 2 :(得分:0)

他们之间的巨大差异。

在第一个选项中,只有在调用没有参数的构造函数时才会实例化。如果你放置并调用任何参数化的构造函数,则B类将不会实例化。

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