Java 默认构造函数真正做什么?

Java 默认构造函数真正做什么?,java,oop,constructor,Java,Oop,Constructor,关于java中默认构造函数的真正作用,我有一些不理解的地方。在有关对象创建的官方教程中: 所有类都至少有一个构造函数。如果类没有显式声明,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。此默认构造函数调用类父级的无参数构造函数,如果类没有其他父级,则调用对象构造函数。如果父对象没有构造函数(对象确实有一个构造函数),编译器将拒绝该程序 在文档中,关于默认构造函数() 如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数 因此,即使

关于java中默认构造函数的真正作用,我有一些不理解的地方。在有关对象创建的官方教程中:

所有类都至少有一个构造函数。如果类没有显式声明,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。此默认构造函数调用类父级的无参数构造函数,如果类没有其他父级,则调用对象构造函数。如果父对象没有构造函数(对象确实有一个构造函数),编译器将拒绝该程序

在文档中,关于默认构造函数()

如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数

因此,即使是类对象的默认构造函数也有一个空的主体。我知道默认构造函数不会将字段初始化为默认值,因为编译器会这样做:

声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值

我不明白的是,如果我们没有声明构造函数,默认构造函数真正做什么?

默认构造函数真正做什么

它调用
super()
。按照你们所有的报价。除此之外什么也不做

如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数

i、 它不做其他事情。对于那些相信它会初始化实例变量的人,请查看相反的断言

默认构造函数真正做什么

它调用
super()
。按照你们所有的报价。除此之外什么也不做

如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数

i、 它不做其他事情。对于那些相信它会初始化实例变量的人,请查看相反的断言

我不明白的是,如果我们没有声明构造函数,那么 默认构造函数真的可以吗

默认情况下,如果没有声明构造函数,则类具有没有参数的默认构造函数。
我认为这就是为什么默认情况下所有构造函数调用
super()
。它可能遵循配置原则之上的约定

无论您声明公共构造函数还是根本不声明构造函数,构造函数的第一条指令都是
super()

这就是为什么如果在类
MyClass
中定义一个带有args
MyClass(String s)
的构造函数,而不保留一个没有参数的构造函数,
MyClass
子类的构造函数无法编译,而在它们的第一条指令中,即对现有父构造函数的调用,在示例中,它将是
super(字符串…

这里有一个例子:

public class MyClassWithNoArg{
  public MyClassWithNoArg(){
  }
}
MyClassWithNoArg
构造函数在第一条指令中调用
super()
,即使源代码中没有指定它

就好像是这样写的:

public class MyClassWithNoArg{
  public MyClassWithNoArg(){
     super();
  }
}
现在想象另一个类
MyClassWithArg

public class MyClassWithArg{
  public MyClassWithNoArg(String s){
  }
}
MySubclass
MyClassWithArg

public class MySubclass extends MyClassWithArg{
  public MySubclass (String s){
  }

  public MySubclass (){
  }
}
在这两种情况下,它都不会编译,因为如前所述,默认情况下,所有构造函数都会调用其父级的默认构造函数(
super()
),但在此父级,
MyClassWithArg
,没有不带arg的构造函数。所以,它不编译

所以要解决这个问题,必须调用存在的超级构造函数

public class MySubclass extends MyClassWithArg{
  public MySubclass (String s){
     super(s);
  }

  public MySubclass (){
    super("");
  }
}
现在,编译就可以了

我不明白的是,如果我们没有声明构造函数,那么 默认构造函数真的可以吗

默认情况下,如果没有声明构造函数,则类具有没有参数的默认构造函数。
我认为这就是为什么默认情况下所有构造函数调用
super()
。它可能遵循配置原则之上的约定

无论您声明公共构造函数还是根本不声明构造函数,构造函数的第一条指令都是
super()

这就是为什么如果在类
MyClass
中定义一个带有args
MyClass(String s)
的构造函数,而不保留一个没有参数的构造函数,
MyClass
子类的构造函数无法编译,而在它们的第一条指令中,即对现有父构造函数的调用,在示例中,它将是
super(字符串…

这里有一个例子:

public class MyClassWithNoArg{
  public MyClassWithNoArg(){
  }
}
MyClassWithNoArg
构造函数在第一条指令中调用
super()
,即使源代码中没有指定它

就好像是这样写的:

public class MyClassWithNoArg{
  public MyClassWithNoArg(){
     super();
  }
}
现在想象另一个类
MyClassWithArg

public class MyClassWithArg{
  public MyClassWithNoArg(String s){
  }
}
MySubclass
MyClassWithArg

public class MySubclass extends MyClassWithArg{
  public MySubclass (String s){
  }

  public MySubclass (){
  }
}
在这两种情况下,它都不会编译,因为如前所述,默认情况下,所有构造函数都会调用其父级的默认构造函数(
super()
),但在此父级,
MyClassWithArg
,没有不带arg的构造函数。所以,它不编译

所以要解决这个问题,必须调用存在的超级构造函数

public class MySubclass extends MyClassWithArg{
  public MySubclass (String s){
     super(s);
  }

  public MySubclass (){
    super("");
  }
}

现在,编译就可以了。

在Java中,如果不声明任何构造函数,编译器将创建一个默认构造函数,而这个构造函数