【问题标题】:default value for instance variable in the class body [duplicate]类主体中实例变量的默认值[重复]
【发布时间】:2021-05-16 05:22:57
【问题描述】:

当我们在类的主体中编写Instance变量,并且给定构造函数初始化它们,那么为什么我们可以直接在构造函数之外初始化变量而不去构造函数呢?这不是构造函数的职责吗?

class Sample{
LinkedList<String> string=new LinkedList<>();//Initializing in the body of the class
String value="Hi";//Initializing in the body of the class

   public Sample(){
   //shouldnt string and value initialize here?}
}

【问题讨论】:

标签: java class constructor initialization instance


【解决方案1】:

字段初始化发生在构造函数主体执行之前。这在某些情况下很有用,例如,如果您有多个构造函数,并且该字段应该具有相同的初始值。在您的示例中,您总是希望从一个空列表开始,因此您可以避免空指针异常。这对于一般的集合来说确实是一个很好的做法。

【讨论】:

  • 你的意思是在类体中初始化变量后,在默认构造函数中就不再取默认值了吗?
  • @amz 不,构造函数体是在字段初始化之后执行的,所以构造函数可以覆盖该值。重要说明:您示例中的构造函数不是“默认”构造函数,它实际上被称为无参数构造函数。默认构造函数是Java 自动创建的构造函数,如果您没有定义任何构造函数。但即使使用默认构造函数,它的主体仍然会在所有字段初始化完成后执行。
【解决方案2】:

为什么我们可以?因为语言说你可以。

这可能是一个不令人满意的答案,但基本上就是这样。

我认为这只是风格偏好的问题。对于简单的情况,特别是当我不需要任何带参数的构造函数时,我将使用初始化程序 (String foo = "bar") 而不是在构造函数中这样做。对于具有许多变量和多个构造函数的复杂情况,我可能会使用初始化器,然后让构造函数处理需要不同的值。对于中间情况,我倾向于将其全部设置在构造函数中。

【讨论】:

    【解决方案3】:

    您的问题更多关于软件设计。在某些情况下,您需要为对象设置一些默认值。我个人尽量在构造函数中初始化值。我认为它更清楚,因为构造函数的任务是构建对象的新实例。另外,我相信尝试使对象不可变是一种很好的做法,这意味着您有 final 字段并在构造函数中初始化它们。当然,这并不总是可能的,但不可变对象容易出现错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2013-08-16
      • 2016-11-11
      • 1970-01-01
      相关资源
      最近更新 更多