2013-10-19 107 views
1

在构造函数内创建成员或在其外部创建成员有什么区别?在构造函数中创建成员或在构造函数外创建成员之间的区别

实施例1:

public class Person 
{ 
List<Person> friends = new List<Person>(); 

public Person() 
{ 

} 

} 

实施例2:

public class Person 
{ 
List<Person> friends; 

public Person() 
{ 
friends = new List<Person>(); 
} 

} 

我使用C#作为一个例子,但这适用于任何OOP语言。

两者之间有实际区别吗?由于某种原因,我已经将Example 2描述为更清晰的实现它的方式。

+0

可能的重复:http://stackoverflow.com/questions/4916735/default-constructor-vs-inline-field-initialization?rq=1 –

回答

1

在C#中我不认为它很重要。在构建实例时,在声明时初始化的变量(如果有的话)将在构造函数运行之前初始化。 如果这些变量不是acccessed再有就是他们

的功能没有差异为了更好的参考检查: - Best Practice: Initialize class fields in constructor or at declaration?

引用一条线是从上面的链接(通过遁辞的说)

真的很重要

就最佳实践而言,前者比后者更不容易出错,因为某人可以轻松地添加另一个构造函数,并忘记将其链接到 。

1

这里剽窃甲骨文的Java教程:http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

正如你所看到的,你可以经常在其声明中的字段提供初始值:

public class BedAndBreakfast { 
    private boolean full = false; 
} 

这种运作良好,在初始化时值可用,初始化可以放在一行上。但是,这种初始化形式由于其简单性而具有局限性。如果初始化需要某些逻辑(例如,错误处理或for循环来填充复杂数组),则简单分配是不充分的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。

1

我会尝试从Java的角度来分析它。除非你的变量/成员是一个static,否则它并不重要。示例2有时被称为lazy initialization,您将推迟朋友列表的初始化,直到调用构造函数。但作为朋友是不是static编译器会将您的实例1的方式与例2类似的从HERE

域声明,但是,都没有任何方法的一部分,这样的语句是他们 无法执行。相反,Java编译器 会自动生成实例字段初始化代码,并将其 放入该类的构造函数或构造函数中。初始化代码 被插入在它出现在 源代码,这意味着一个场的初始化可以使用它之前声明的字段的初始 值的顺序的构造函数。

因此编译器只是将您的示例1代码转换为示例2,以便它可以以类似的方式初始化。

相关问题