Java默认构造函数

Java默认构造函数,java,constructor,default-constructor,Java,Constructor,Default Constructor,什么是默认构造函数?你能告诉我以下哪一个是默认构造函数,以及它与其他构造函数的区别吗 public Module() { this.name = ""; this.credits = 0; this.hours = 0; } public Module(String name, int credits, int hours) { this.name = name; this.credits = credits; this.hours = hours; }

什么是默认构造函数?你能告诉我以下哪一个是默认构造函数,以及它与其他构造函数的区别吗

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}

如果未在类中定义任何构造函数,则会创建默认构造函数。它只是一个不做任何事情的无参数构造函数。编辑:调用超级()除外


他们两个都不是。如果您定义它,它不是默认值

默认构造函数是自动生成的无参数构造函数,除非您定义另一个构造函数。任何未初始化的字段都将设置为其默认值。对于您的示例,假设类型是
String
int
int
,并且类本身是公共的,则看起来是这样的:

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}
这与

public Module()
{}
和完全没有构造函数一样。但是,如果至少定义了一个构造函数,则不会生成默认构造函数

参考:

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数和没有throws子句的默认构造函数

澄清 从技术上讲,默认初始化字段的不是构造函数(默认值或其他值)。然而,我留下答案是因为

  • 这个问题把默认值搞错了
  • 无论是否包含,构造函数都具有完全相同的效果

    • 默认构造函数不接受任何参数:

      public class Student { 
          // default constructor
          public Student() {   
      
          }
      }
      

      如果未在类中显式定义至少一个构造函数,编译器将自动生成默认构造函数。您已经定义了两个,因此您的类没有默认构造函数

      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }
      
      根据Java语言规范第三版:

      8.8.9默认构造函数

      如果类不包含构造函数 声明,然后是默认值 不带参数的构造函数 是自动提供的


      Java提供了一个默认构造函数,当没有提供显式构造函数时,它不接受参数,也不执行特殊操作或初始化

      隐式默认构造函数执行的唯一操作是使用super()调用调用超类构造函数。构造函数参数为您提供了一种为对象初始化提供参数的方法

      下面是一个包含2个构造函数的多维数据集类的示例。(一个默认构造函数和一个参数化构造函数)


      一般术语是,如果在对象中不提供任何构造函数,则会自动放置一个无参数构造函数,称为默认构造函数。

      如果您确实定义了一个与不提供任何参数时将放置的构造函数相同的构造函数,它通常被称为无参数构造函数。这只是一个惯例,尽管有些程序员更喜欢将此显式定义的无参数构造函数称为默认构造函数。但是如果我们通过命名,如果我们显式地定义了一个,那么它不会使它成为默认值

      按照

      如果类不包含构造函数声明,则隐式声明一个没有形式参数和无throws子句的默认构造函数。

      范例

      public class Dog
      {
      }
      
      将自动修改(通过添加默认构造函数),如下所示

      public class Dog{
          public Dog() {
      
          }
      } 
      
      当你创建它的对象时

       Dog myDog = new Dog();
      

      将调用此默认构造函数。

      您好。根据我的知识,让我明确默认构造函数的概念:

      编译器自动提供一个无参数的默认构造函数 对于没有构造函数的任何类。此默认构造函数将调用 超类的无参数构造函数。在这种情况下 如果超类没有无参数,编译器将发出抱怨 所以您必须验证它是否存在。如果你的班级没有 显式超类,然后它有一个对象的隐式超类, 它确实有一个无参数构造函数

      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }
      

      我从中阅读了这些信息。

      如果一个类没有程序员提供的任何构造函数,那么java编译器将添加一个带有out参数的默认构造函数,该构造函数将使用super()调用在内部调用超类构造函数。这称为默认构造函数

      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }
      
      在您的例子中,当您以编程方式添加它们时,没有默认构造函数。 若并没有您添加的构造函数,那个么编译器生成的默认构造函数将如下所示

      public Module()
      {
         super();
      }
      
      注意:在默认构造函数中,它还将添加super()调用,以调用超类构造函数

      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }
      
      添加默认构造函数的目的:

      构造函数的职责是初始化实例变量,若并没有实例变量,可以选择从类中删除构造函数。但当您继承某个类时,您的类负责调用超级类构造函数,以确保超级类正确初始化其所有实例变量


      这就是为什么如果没有构造函数,java编译器会添加一个默认构造函数并调用超级类构造函数。

      当我们没有显式定义类的构造函数时,java会为该类创建一个默认构造函数。它本质上是一个非参数化构造函数,即它不接受任何参数

      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }
      
      默认构造函数的工作是调用超类构造函数并初始化所有实例变量。如果超类构造函数不存在,那么它会自动将实例变量初始化为零。这就是使用构造函数的目的,构造函数初始化对象的内部状态,这样创建实例的代码就有了一个完全初始化的、可用的对象


      一旦我们为类定义了自己的构造函数,就不再使用默认构造函数。因此,它们实际上都不是默认构造函数。

      默认构造函数指的是自动生成的构造函数
      public class Cube1 {
          int length;
          int breadth;
          int height;
          public int getVolume() {
              return (length * breadth * height);
          }
      
          Cube1() {
              length = 10;
              breadth = 10;
              height = 10;
          }
      
          Cube1(int l, int b, int h) {
              length = l;
              breadth = b;
              height = h;
          }
      
          public static void main(String[] args) {
              Cube1 cubeObj1, cubeObj2;
              cubeObj1 = new Cube1();
              cubeObj2 = new Cube1(10, 20, 30);
              System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
              System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
          }
      }