这两种方法在Java中初始化字段有什么区别?

时间:2011-03-17 07:44:11

标签: java variable-assignment

  1. 使用字段声明
  2. 同时为字段分配值
  3. 将值分配给构造函数中的字段?

5 个答案:

答案 0 :(得分:7)

  

这两种初始化Java字段的方法之间的区别是什么?

不多!主要区别在于,如果您在声明点分配它,它将适用于所有构造函数。也就是说,你无法忘记将初始化添加到任何未来的构造函数中。

查看官方Initializing Fields路径。

值得注意的是,如果你在声明中初始化字段,它会在构造函数开始执行之前发生。

根据经验,我通常会在声明中初始化“死简单”字段(毫无疑问,初始值应该是什么)。这“清理”例如

class SomeClass {

    List<Integer> currentNumbers = new ArrayList<Integer>();
    int counter = 0;

    // ...
}

虽然我可能希望在不同的构造函数中有不同的行为,但我将它留给构造函数。

答案 1 :(得分:4)

在这两种情况下,只有在超类构造函数执行完毕后才会为分配值。

对于第一个选项,您必须能够在不参考任何构造函数参数的情况下确定值。

对于第二个选项,您需要在每个构造函数重载中分配值。

基本上我倾向于支持第二个选项,当值取决于构造函数参数(通常是我希望它依赖的所有参数)和第一个选项,当任何的值相同时新初始化的实例。我倾向于不要混合和匹配单个字段,使用带声明的初始化程序,在某些构造函数重载中分配它,但即使这样偶尔也会有用。 (想象一下大多数构造函数的大小为0的集合,但是有一个构造函数可以获取一组初始值。)

虽然可以引用变量声明中的其他实例成员,但我不愿意 - 当您的对象仅部分初始化时调用实例方法很脆弱,并且引用其他变量依赖于变量排序,这对我来说很难看。

答案 2 :(得分:1)

(1)是(2)的语法糖(静态字段除外)

答案 3 :(得分:0)

它完全相同,只是在对象实例化生命周期的不同时间。有关详细信息,请查看here

答案 4 :(得分:0)

在第一种情况下,将在初始化类时创建字段并直接分配您为其声明的值,而在第二种情况下,将创建字段并为其分配默认值(如果它是对象,则为null) 0如果它是一个int等,然后在执行构造函数时分配正确的值。当然,实际上通常没有太大区别,因为两种情况下的结果都是相同的:当构造函数返回后创建此类的实例时,字段被正确初始化。我想第一种方法会更有用,如果你有多个构造函数和一个字段应该具有相同的值,无论调用哪个构造函数。