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

时间:2016-11-10 09:45:40

标签: java oop constructor

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

  

Creating Objects

     

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

在有关默认构造函数(§8.8.9

的文档中
  

8.8.9. Default Constructor

     

如果声明的类是原始类Object ,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。

所以即使Object类的默认构造函数也有一个空体。我知道默认构造函数 NOT 将字段初始化为默认值,因为它是编译器执行此操作的那些:

  

Default Values

     

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

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

4 个答案:

答案 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){
  }
}

MySubclassMyClassWithArg

的子类
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编译器添加构造函数。

现在问题是构造函数的作用。

  1. 为新对象分配内存
  2. 如果用户定义了任何其他操作,例如初始化已完成的变量。