Java 子类是否需要有构造函数?

Java 子类是否需要有构造函数?,java,subclass,superclass,Java,Subclass,Superclass,我一直在学习遗传,我只是好奇。我知道即使不使用super()操作符,子类也会自动调用超类的构造函数,所以我想知道子类是否需要在其中包含构造函数。如果超类没有默认构造函数,子类需要构造函数如果子类根本没有构造函数,编译器将自动创建一个public构造函数,该构造函数只调用超类的默认构造函数 关于调用super()。这两个调用都不能转到其他任何地方。如果构造函数没有以其中任何一个开头,编译器将自动插入对super()(无任何参数)的调用。因此,如果您希望的行为是调用默认超类构造函数(很多时候是这样的

我一直在学习遗传,我只是好奇。我知道即使不使用
super()
操作符,子类也会自动调用超类的构造函数,所以我想知道子类是否需要在其中包含构造函数。

如果超类没有默认构造函数,子类需要构造函数如果子类根本没有构造函数,编译器将自动创建一个
public
构造函数,该构造函数只调用超类的默认构造函数

关于调用
super()。这两个调用都不能转到其他任何地方。如果构造函数没有以其中任何一个开头,编译器将自动插入对
super()
(无任何参数)的调用。因此,如果您希望的行为是调用默认超类构造函数(很多时候是这样的)那么您就不需要自己显式地调用
super()

还有一种情况是,即使超类没有默认构造函数,您也不需要提供构造函数(事实上,您不能提供构造函数)是指使用非默认构造函数创建类的匿名子类;编译器将自动创建具有正确参数的构造函数,并调用相应的(非默认)超类构造函数。例如:

class X {
    public X(int value) { ... } // no default constructor!
    public void foo() { ... }
}

X myX = new X(3) {
    @Override
    public void foo() { ... }
};
然后,
myX
将是X的一个匿名子类的实例,该子类具有编译器生成的构造函数,该构造函数接受一个
int
参数并调用
super(intArg)

由于无法为匿名类编写构造函数,因此存在一个问题:如果在创建对象时需要进行对象初始化,该怎么办?解决方案是使用。例如:

X myX = new X(3) {
    // Field unique to this subclass of X:
    private int baz;
    {
        // code here runs as if it were at the start of every constructor
        baz = ...;
    }
    @Override
    public void foo() { ... }
};

如果默认的超类构造函数通过super()访问如果可用,则子类不需要显式构造函数;它将自动获得默认的无参数构造函数。如果超类有显式构造函数,且所有构造函数都带有参数,则子类也需要显式构造函数,因为没有此类构造函数,将无法知道哪些参数应使用调用超类构造函数。

如果超类没有默认(即没有参数)构造函数,则必须定义调用特定超构造函数的构造函数

如果超类确实有默认构造函数,则不必声明构造函数,因为如果不声明任何构造函数,将为您隐式定义以下构造函数:

SubClass() {
    super();  // Note: the no-args super constructor may itself be implicit
}

所以在这种情况下,您不必在子类中声明构造函数。

如果默认构造函数在超类中可用,那么编译器将在子类的默认构造函数中包含默认构造函数调用-

class  Base(){
  Base(){ // default constructor
    ...
  }
}

class Sub extends Base{
   // no constructor
}
在这种情况下,不需要

class  Base(){
  Base( int i){ // no default constructor
    ...
  }
}

class Sub extends Base{
   // no constructor
}
在这种情况下,它是必需的

class Sub extends Base{
   Sub(){ 
      Base(1);
   }
}

嗯..如果你不提供一个,编译器会为你做的。所以,是的“有必要有一个构造函数”。只是没有必要“定义它”。