Java类成员初始化

8

作为一个多年的Java程序员,我有点羞于问这个问题,但是还是要问一下:
在构造对象时分配内存和在声明相关字段时直接分配内存之间有什么区别吗?也就是说,以下两种方法有什么区别:

public class MyClass{
    MyObj obj=new MyObj();
}

并且

public class MyClass{
    MyObj obj;
    public MyClass() {
        obj=new MyObj();
    }
}

当然,我假设这些特定的初始化不依赖于外部参数。

2
没有什么好羞耻的。每个人都在这里学习! - bdhar
2个回答

3
实例变量初始化在构造函数调用之前完成。这样做不好
如果你希望在初始化之前执行某些操作,可以限制用户调用const。

最佳实践:

  1. 不要在声明中使用默认值进行初始化(null、false、0、0.0...)。
  2. 如果没有构造函数参数改变字段的值,则优先在声明中进行初始化。
  3. 如果字段的值因构造函数参数而更改,请将初始化放在构造函数中。
  4. 在实践中保持一致。(最重要的规则)
来源:这里

同时,使用静态变量/方法调用时,如果变量在构造函数之前未初始化,则可能会生成NullPointerException。 - Sean
1
我认为这些规则中没有任何一条是“最佳实践”。它们都不会对代码的可读性产生重大影响,而这才是真正重要的事情。 - Stephen C
代码的可读性不仅仅是一个问题,我认为它对我来说是最好的选择。当然,任何Java程序员都会首先选择const.来阅读代码。 - jmj

2

没有,除非你添加多个构造函数,否则会有重复的代码。

另一种选择是使用初始化块。

{
   var = 1;
}

参考:初始化字段


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接