【问题标题】:What's the point of a default constructor in OOP?OOP 中的默认构造函数有什么意义?
【发布时间】:2022-01-19 05:26:09
【问题描述】:

在计算机科学方面,我相对较新/缺乏经验。我想知道拥有默认构造函数的意义在于,您可以在类中声明您想要的任何字段并使用您希望它们具有的任何默认值初始化它们。然后,您可以编写重载的构造函数。

为了了解我在说什么,这里有一个例子。

public class Restaurant {
      String name = "No name";
      int Rating = -1;
}

public class Restaurant {
     String name;
     int rating;
     public Restaurant() {
           name = "No name";
           rating = -1;
     }
           

【问题讨论】:

  • 一个原因:一些框架,比如 Hibernate,需要一个显式的默认构造函数。
  • 另外,如果你想要多个构造函数,一个不带参数,假设一个有两个。如果只写一加二,不带参数是得不到的,所以也要写。
  • 一旦你创建了一个带参数的构造函数,你将不再有一个默认的构造函数,所以你需要明确定义一个无参数的构造函数,如果需要的话。
  • 默认构造函数的整个想法是帮助您减少编写的代码量。有时你甚至不需要构造函数,比如主类。

标签: java oop constructor default-constructor


【解决方案1】:

构造函数主要用于制作对象。就变量初始化而言,当您初始化一个变量(实例变量)时,您会更改作为您刚刚创建的对象的成员的变量。您将通过下面给出的示例(您的 eg 本身)更好地理解它:

public class Restaurant {
   String name;
   int rating;
   public Restaurant() {
       name = "No name";
       rating = -1;
   }
}

现在假设你创建了一个对象,

Restaurant obj = new Restaurant();

在这里,obj.name = "No name"obj.rating=-1。请注意,nameobj.name 是不同的。现在当你使用你给出的第一个代码时,

public class Restaurant {
    String name = "No name";
    int Rating = -1;
}

现在无论您创建哪个对象,每个对象的变量 name 将仅包含 "No name"

因此,当您必须使用对象时,您应该通过构造函数初始化实例变量。对了,instance本身就是object的意思……

【讨论】:

    【解决方案2】:

    当您的变量初始化基于某些逻辑时,您需要编写一些代码并且为此需要默认构造函数。 Java 提供了另一种称为初始化块的方法,您也可以这样做,但一致性是关键。构造函数用于对象构造,让它从代码可读性和可维护性的角度处理构造。

    【讨论】:

      【解决方案3】:

      恕我直言,默认构造函数不是 OOP 的要求。这更像是 Java 的要求:每个类必须至少有一个构造函数。 JLS: 8.8.9 Default Constructors 强调了这一点:

      如果类不包含构造函数声明,则隐式声明默认构造函数。

      如果您的类包含至少一个构造函数声明(如第二个示例),则不会生成默认构造函数。


      注意写的时候

      public class Restaurant {
          String name = "No name";
          int Rating = -1;
      }
      

      字段初始值设定项 name = "No name";Rating = -1; 作为构造函数 (JLS 12.5 Creation of New Class Instances) 的一部分执行:

      就在对新创建对象的引用作为结果返回之前,使用以下过程处理指示的构造函数以初始化新对象:

      1. 将构造函数的参数分配给此构造函数调用新创建的参数变量。

      2. 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(第 8.8.7.1 节)开始(使用 this),则评估参数并使用这五个相同的步骤递归地处理该构造函数调用。如果该构造函数调用突然完成,则此过程出于相同原因而突然完成;否则,继续第 5 步。

      3. 此构造函数不是以显式调用同一类中的另一个构造函数开始的(使用 this)。如果此构造函数用于 Object 以外的类,则此构造函数将以显式或隐式调用超类构造函数开始(使用 super)。使用这五个相同的步骤递归地评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程出于相同的原因突然完成。否则,继续第 4 步。

      4. 为这个类执行实例初始化器和实例变量初始化器,将实例变量初始化器的值分配给相应的实例变量,按照它们在文本中出现的从左到右的顺序类的源代码。如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成相同的异常。否则,继续第 5 步。

      5. 执行此构造函数的其余部分。如果该执行突然完成,则此过程出于同样的原因突然完成。否则,此过程正常完成。

      这个初始化代码被添加到每个构造函数中——无论是默认构造函数还是您编写的任何构造函数。

      【讨论】:

        猜你喜欢
        • 2018-07-17
        • 2015-04-11
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多