答案 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等,然后在执行构造函数时分配正确的值。当然,实际上通常没有太大区别,因为两种情况下的结果都是相同的:当构造函数返回后创建此类的实例时,字段被正确初始化。我想第一种方法会更有用,如果你有多个构造函数和一个字段应该具有相同的值,无论调用哪个构造函数。