class Firework{
}
class Fountain extends Firework {
}
如上所示,喷泉型烟花是烟花的一种。在这种情况下Java会自动为这两个类提供一个默认的无参数的构造器方法。因而,按照如下的代码实例化Fountain类也是合法的:
Fountain f = new Fountain();
但是如果我们为超类添加一个带参数的构造器方法,如:
class Firework{
public Firework(String name) {
}
}
则再编译Fountain类,会发现编译错误。提示说Fountain类没有显示定义构造器。
上述解释:
首先从Java机制上讲,仅当一个类没有显示定义构造器时,Java才会默认为其提供一个无参数的构造器,并且该构造器会默认的调用super()方法,即超类的无参数构造器。相反当类显示定义了一个构造器时,Java就不会提供默认的无参数构造器了。
上面的代码从Java预编译上讲,会是如下:
class Firework{
public Firework(String name) {
super ();
}
}
class Fountain extends Firework{
public Fountain() {
super (); //欲调用父类构造器Firework()
}
}
由上可知,因为父类Firework()不存在,将导致子类编译错误。
为使上述代码通过可以通过下面方式之一:
1) 在父类中显示定义一个无参数的构造器,即:
public Firework() {
}
2) 在子类构造器中,显示调用超类已有的构造器,这里是
public Fountain() {
super ("name"); //欲调用父类构造器Firework(String name)
}