哪个新的首先执行 – 在构造函数中还是在外?

如果我定义一个类如下:


公共类myClass {
     private x = new anotherClass();
    私人y;

     public myClass(){
         y = new anotherClass();
     } 
 }

哪个变量会更早获得实例? x还是y?

并且,在构造函数之外分配变量是不建议的吗?

执行顺序是:

  • 超类构造函数(或同一类的链式构造函数)
  • 实例变量初始值设定项(在代码中分配给x的表达式)
  • 构造函数体(在代码中分配给y的语句)

Java语言规范的12.5节包含详细信息。

是否在构造函数中分配变量取决于您 – 我非常喜欢经验法则,如果初始值不依赖于任何构造函数参数,并且对于所有构造函数始终相同,则使用变量初始值设定项。 否则,在构造函数中指定它。

代码中的变量没有类型,但在调用构造函数之前首先实例化x 。 (对构造函数的x进行null检查以找出)。

至于推荐,这取决于你。 有一件事,例如在JavaBeans中,因为我通常不编写默认的公共构造函数(没有参数),我倾向于在声明上初始化一些字段(如果它们需要不为null)。 否则,我在构造函数上实例化它们。

我建议你测试,而不是仅仅从其他人那里得到答案:

使anotherClass的构造函数打印传递的字符串。

 public class myClass { private anotherClass x = new anotherClass("outside constructor"); private anotherClass y; public myClass() { y = new anotherClass("inside constructor"); } } 

然后你可以告诉我们!