Java 默认构造函数真正做什么?
关于java中默认构造函数的真正作用,我有一些不理解的地方。在有关对象创建的官方教程中: 所有类都至少有一个构造函数。如果类没有显式声明,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。此默认构造函数调用类父级的无参数构造函数,如果类没有其他父级,则调用对象构造函数。如果父对象没有构造函数(对象确实有一个构造函数),编译器将拒绝该程序 在文档中,关于默认构造函数() 如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数 因此,即使是类对象的默认构造函数也有一个空的主体。我知道默认构造函数不会将字段初始化为默认值,因为编译器会这样做: 声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值 我不明白的是,如果我们没有声明构造函数,默认构造函数真正做什么? 默认构造函数真正做什么 它调用Java 默认构造函数真正做什么?,java,oop,constructor,Java,Oop,Constructor,关于java中默认构造函数的真正作用,我有一些不理解的地方。在有关对象创建的官方教程中: 所有类都至少有一个构造函数。如果类没有显式声明,Java编译器会自动提供一个无参数构造函数,称为默认构造函数。此默认构造函数调用类父级的无参数构造函数,如果类没有其他父级,则调用对象构造函数。如果父对象没有构造函数(对象确实有一个构造函数),编译器将拒绝该程序 在文档中,关于默认构造函数() 如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数 因此,即使
super()
。按照你们所有的报价。除此之外什么也不做
如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数
i、 它不做其他事情。对于那些相信它会初始化实例变量的人,请查看相反的断言
默认构造函数真正做什么
它调用super()
。按照你们所有的报价。除此之外什么也不做
如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数
i、 它不做其他事情。对于那些相信它会初始化实例变量的人,请查看相反的断言
我不明白的是,如果我们没有声明构造函数,那么
默认构造函数真的可以吗
默认情况下,如果没有声明构造函数,则类具有没有参数的默认构造函数。我认为这就是为什么默认情况下所有构造函数调用
super()
。它可能遵循配置原则之上的约定
无论您声明公共构造函数还是根本不声明构造函数,构造函数的第一条指令都是super()
这就是为什么如果在类
MyClass
中定义一个带有argsMyClass(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
中定义一个带有argsMyClass(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中,如果不声明任何构造函数,编译器将创建一个默认构造函数,而这个构造函数