最近在复习一些java基础的东西。发现继承后构造函数的继承很有意思,所以进行了一下测试:
- 测试1-如果父类不主动创建构造函数则子类创建构造函数没有限制。
- 测试2-如果父类创建不含参构造函数则子类创建构造函数没有限制且先执行父类的构造函数。
- 测试3-如果父类创建含参构造函数则子类创建构造函数需要先super父类函数且先执行父类的构造函数。
- 测试4-如果父类创建多个含参构造函数则子类创建构造函数需要先super指定的父类函数(如父类包含无参构造函数则子类可以不super父类函数同测试2)。
测试1-如果父类不主动创建构造函数则子类创建构造函数没有限制
父类
public class Father {
}
子类
public class Child extends Father {
public Child(String a, int b) {
System.out.println("这是子类的构造函数");
}
public static void main(String[] args) {
Child t3 = new Child("xx",1);
}
}
结果
这是子类的构造函数
测试2-如果父类创建不含参构造函数则子类创建构造函数没有限制且先执行父类的构造函数
父类
public class Father {
public Father() {
System.out.println("这是父类的构造函数");
}
}
子类
public class Child extends Father {
public Child(String a, int b) {
System.out.println("这是子类的构造函数");
}
public static void main(String[] args) {
Child t3 = new Child("xx",1);
}
}
结果
这是父类的构造函数
这是子类的构造函数
测试3-如果父类创建含参构造函数则子类创建构造函数需要先super父类函数且先执行父类的构造函数
父类
public class Father {
public Father(int a) {
System.out.println("这是父类的构造函数");
}
}
子类
public class Child extends Father {
public Child(String a, int b) {
super(1);
System.out.println("这是子类的构造函数");
}
public static void main(String[] args) {
Child t3 = new Child("xx",1);
}
}
结果
这是父类的构造函数
这是子类的构造函数
测试4-如果父类创建多个含参构造函数则子类创建构造函数需要先super指定的父类函数(如父类包含无参构造函数则子类可以不super父类函数同测试2)
父类
public class Father {
public Father(int a) {
System.out.println("这是父类的构造函数1");
}
public Father(String b) {
System.out.println("这是父类的构造函数2");
}
}
子类
public class Child extends Father {
public Child(){
super("a");
System.out.println("这是子类的构造函数调用2");
}
public Child(String a, int b) {
super(1);
System.out.println("这是子类的构造函数调用1");
}
public static void main(String[] args) {
Child t3 = new Child("xx",1);
Child t4 = new Child();
}
}
结果
这是父类的构造函数1
这是子类的构造函数调用1
这是父类的构造函数2
这是子类的构造函数调用2
综上测试得出如下结论:
1、如果父类不主动创建构造函数或者父类有无参的构造函数则子类可以不考虑父类的构造函数。
2、如果子类需要继承父类的含参构造函数则需要使用super命令(如果父类包含多个含参构造函数则依据参数使用super命令)
3、如果父类建立了构造函数且都含有参数,则子类必须使用super命令。