Java 在类主体或构造函数中初始化类成员?

Java 在类主体或构造函数中初始化类成员?,java,constructor,initialization,Java,Constructor,Initialization,这两种初始化类成员的方法有什么区别吗 在班集体中: public class A { private mB = new B(); public A() { } } 或在构造函数中: public class A { private mB = null; public A() { mB = new B(); } } 我会做你认为更简单的 主要区别在于,如果在第一个构造函数中添加另一个构造函数,则不必重复初始化。我将使用您认为更简单

这两种初始化类成员的方法有什么区别吗

在班集体中:

public class A {
    private mB = new B();
    public A() {
    }
}
或在构造函数中:

public class A {
    private mB = null;
    public A() {
        mB = new B();
    }
}

我会做你认为更简单的


主要区别在于,如果在第一个构造函数中添加另一个构造函数,则不必重复初始化。

我将使用您认为更简单的构造函数


主要区别在于,如果在第一个构造函数中添加另一个构造函数,则不必重复初始化。

实例初始化器首先运行,然后初始化构造函数中的值。您可以研究首先运行实例初始值设定项,然后初始化构造函数中的值。您可以研究

如果B()构造函数抛出了一个选中的异常,那么

private mB = new B();
这将是一个编译时错误,而在构造函数中,您可以捕获它或在
throws
子句中声明它,如果B()构造函数抛出了一个选中的异常,那么

private mB = new B();

这将是一个编译时错误,而在构造函数中,您可以捕获它或在
throws
子句中声明。理论上,初始化顺序不同。这是JVM使用的序列:

  • 执行静态语句/静态块
  • 实例变量被指定为默认值
  • 如果为实例变量分配了编译时常量,则会初始化实例变量。否则,将使用第5项完成(实例变量和实例初始值设定项将按照定义的顺序从上到下一起完成)
  • 构造函数运行
  • 实例初始化块在对super的所有调用完成后但在构造函数的其余部分执行之前运行
  • 构造函数的其余部分将被执行

  • 此外,如果您初始化构造函数中的字段,这可能意味着您可能会得到一些重复。我个人认为,无论是在构造函数中还是在字段中,在何处实例化它们都无关紧要,但主要的一点是,您在这方面是一致的。对我来说,它有助于在字段声明中实例化它们,以便我知道哪些字段始终存在,哪些字段是可选的。希望有帮助

    理论上,初始化顺序不同。这是JVM使用的序列:

  • 执行静态语句/静态块
  • 实例变量被指定为默认值
  • 如果为实例变量分配了编译时常量,则会初始化实例变量。否则,将使用第5项完成(实例变量和实例初始值设定项将按照定义的顺序从上到下一起完成)
  • 构造函数运行
  • 实例初始化块在对super的所有调用完成后但在构造函数的其余部分执行之前运行
  • 构造函数的其余部分将被执行

  • 此外,如果您初始化构造函数中的字段,这可能意味着您可能会得到一些重复。我个人认为,无论是在构造函数中还是在字段中,在何处实例化它们都无关紧要,但主要的一点是,您在这方面是一致的。对我来说,它有助于在字段声明中实例化它们,以便我知道哪些字段始终存在,哪些字段是可选的。希望有帮助

    第一个示例初始化变量一次:第二个示例初始化变量两次。第一个是首选的,尤其是当有多个构造函数时,当然,除非涉及异常。

    第一个示例初始化变量一次:第二个示例初始化变量两次。首先是首选,尤其是如果有多个构造函数,当然除非有例外。

    我认为两者都是相同的。我认为两者都是相同的