子类构造方法如何调用

使用示例:

1
2
3
4
5
public class Base {
public Base(String s){
System.out.println("B");
}
}
1
2
3
4
5
6
7
8
public class Derived extends Base{
public Derived(String s){
System.out.println("D");
}
public static void main(String[] args) {
new Derived("C");
}
}

输出结果:

1
2
3
4
public Derived(String s){
System.out.println("D");
}
上面代码编译报错

改成如下代码即可输出BD(或者个base类加一个无参构造函数也行):

1
2
3
4
public Derived(String s){
super(s);
System.out.println("D");
}

原因分析:

在java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类。子类可以通过extends关键字来继承父类。
通过继承,子类可以得到父类除构造函数以外所有的成员(包括成员变量和成员函数),但是要注意得到并不等于可以随便使用。
在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句,它是用来访问父类中的空参数构造方法,进行父类成员的初始化操作
this()是调用本类的构造方法,super()是调用父类的构造方法,且两条语句不能同时存在
无论如何,子类的所有构造方法,直接或间接必须调用到父类构造方法;子类的构造方法什么都不写,默认的构造方法第一行super()

子父类调用

使用示例:

1
2
3
4
5
6
7
8
public class Base {
public Base(){
foo();
}
private void foo() {
System.out.println("base");
}
}
1
2
3
4
5
6
7
8
9
public class Derived extends Base{
public void foo(String s){
System.out.println("Derived");
}
public static void main(String[] args) {
new Derived();
new Base();
}
}

输出结果是:

1
base base