我不了解默认构造函数在java中的真正作用。在关于对象创建的官方教程中:
所有类至少有一个构造函数。如果类没有显式声明任何类,则Java编译器会自动提供无参数构造函数,称为默认构造函数。如果类没有其他父级,则此默认构造函数调用类父级的无参数构造函数或 Object构造函数。如果父级没有构造函数(对象确实有一个),编译器将拒绝该程序。
在有关默认构造函数(§8.8.9)
的文档中如果声明的类是原始类Object ,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。
所以即使Object类的默认构造函数也有一个空体。我知道默认构造函数 NOT 将字段初始化为默认值,因为它是编译器执行此操作的那些:
在声明字段时,并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。
我不明白的是,如果我们没有声明构造函数,默认构造函数真正做了什么?
答案 0 :(得分:3)
默认构造函数到底是做什么的?
它会调用super()
。根据你的所有报价。并没有别的。 JLS #8.8.9:
如果声明的类是原始类Object,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。
即。它没有别的。对于那些认为它初始化实例变量的人,请参见JLS #12.5,其中相反的是断言。
答案 1 :(得分:2)
我不明白的是,如果我们没有声明构造函数,那么 默认构造函数真的可以吗?
默认情况下,如果没有声明构造函数,则类有一个没有args的默认构造函数。
我认为这就是默认情况下所有构造函数调用super()
的原因。它可能遵循约定优于配置原则。
无论你声明一个 public 构造函数,或者你没有在所有构造函数中声明,构造函数的第一条指令是super()
。
这就是为什么如果在类MyClass
中定义一个带有args MyClass(String s)
的构造函数而不保留没有参数的构造函数,MyClass
子类的构造函数在第一条指令中不精确的时候就无法编译,对现有父构造函数的调用,在示例中,它将是super(String ...)
。
这是一个例子:
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("");
}
}
现在,编译还可以。
答案 2 :(得分:2)
在Java中,如果你没有声明任何构造函数,编译器会创建一个默认构造函数,而这个构造函数调用super()方法,那就是父构造函数。在这个过程中,实例变量就像无默认构造函数一样。
答案 3 :(得分:0)
没有构造函数,没有人可以创建类的对象。现在,如果程序员没有添加任何类的构造函数,那么java编译器在编译之前就会在该类中添加一个构造函数,这在java中称为默认构造函数。
但是如果程序员添加任何类型的构造函数(带参数或没有参数)那么那就成了用户定义的构造函数,并且不会通过java编译器添加构造函数。
现在问题是构造函数的作用。