在类定义的开头或构造函数中初始化成员变量?

在类定义的开头或构造函数中初始化成员变量?

问题描述:

定义和初始化类定义中的成员变量,并首先定义成员变量并初始化构造函数中的成员变量在类定义的开头或构造函数中初始化成员变量?

说,例如:

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

对战:提前

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

感谢。

+1

[最佳实践:初始化构造函数或声明中的类字段?]的可能的重复?(http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at -declaration) –

在你的例子中,唯一的区别是当它们被初始化时。根据JLS,实例变量在构造函数被调用之前被初始化。当你有超级类来处理时,这会变得很有趣,因为初始化顺序并不总是那么明显。因此,请记住,当没有显式超级构造函数被调用时,“超级”实例变量仍将被初始化。

+0

+1我想象一下引入各种难以置信的错误追踪...... –

区别在于它们的初始化/设置顺序。

您的类成员变量将在您的构造函数被调用之前被声明/设置。我个人的偏好是在构造函数中设置它们。

通常构造函数将接受参数并将这些参数分配给类的字段。

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

不确定你的意思? –

+0

@aib,它是Java,而不是C++。 – Triang3l

类内初始化允许您避免编写一个简单的构造函数。

您必须在构造函数中初始化依赖构造函数参数的实例成员。如果没有其他的可读性,将所有其他实例成员初始化到同一个构造函数中可能是合理的。

否则,没有区别。