Java 定义中的初始化与构造函数中的初始化

Java 定义中的初始化与构造函数中的初始化,java,oop,constructor,initialization,theory,Java,Oop,Constructor,Initialization,Theory,在Java中,但在其他OO语言中,在属性定义中初始化属性与在 class Example { public Sample sample_attribute = new Sample(); } 使用构造函数来初始化它 class Example { public Sample sample_attribute; public Example() { sample_attribute = new Sample(); } } 我想不出有什么实际的区

在Java中,但在其他OO语言中,在属性定义中初始化属性与在

class Example {
    public Sample sample_attribute = new Sample();
}
使用构造函数来初始化它

class Example {
    public Sample sample_attribute;

    public Example() {
        sample_attribute = new Sample();
    }
}

我想不出有什么实际的区别,是吗?否则,是否存在一种方法优于另一种方法的情况,即使它们具有相同的结果?

这里的初始化顺序很重要

  • 将字段设置为默认初始值(0、false、null)
  • 调用对象的构造函数(但不执行 建造师(还没有)
  • 调用超类的构造函数
  • 使用初始值设定项和初始化块初始化字段
  • 执行构造函数的主体
  • 因此,第一种情况是在第4步初始化变量
    sample\u属性
    ,第二种情况是在第5步初始化变量
    sample\u属性
    。这完全取决于你的要求


    如果您想从构造函数中访问任何变量,需要使用第一种情况。

    当您使用传递到构造函数中的信息初始化字段时,除了在构造函数中初始化之外,您别无选择。否则,我更喜欢当场初始化,因为这样可以节省我以后必须阅读的代码行。

    这两个版本是等效的。但是,如果
    new Sample()
    抛出了一个选中的异常,您将无法在字段声明中初始化它

    如果查看生成的字节码,构造函数将调用超类构造函数,执行初始化,然后执行构造函数中实际编码的内容。因此,除了在构造函数的任何语句之前执行“初始化”之外,没有任何技术上的区别。@HotLicks:是的,这就是我所说的
    的意思,取决于OP的要求。
    @Ɍ我不同意。我的问题要具体得多(与其他问题不同,它实际上是作为一个问题在身体中提出的)。