子类不继承父类的构造方法,但父类的构造方法对子类构造方法的创建有影响。
1.一个类中若没有定义构造方法,则默认存在一个无参构造方法,格式如下:
public 类名(){
super();
}
2.this([参数列表])调用本类构造方法,必须放在有效代码行第一行,而super();调用父类构造方法,也必须放在有效代码行的第一行。所以如果一个构造方法中已经使用了this就不能使用super,即:this与super不能同时存在;也就是说:如果父类拥有无参构造方法(无论显式还是隐式),且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用本类其他构造方法的构造方法使用super()隐式(默认)调用父类无参构造方法。
public class Father {
public Father() {
System.out.println("父类构造方法");
}
}
public class Son extends Father{
public Son() {
this("w");
System.out.println("子类构造方法");
}
public Son(String name) {
System.out.println(name);
}
}
public class Test {
public static void main(String[] args) {
new Son();
}
}
输出结果:
父类构造方法
w
子类构造方法
3.如果父类没有无参构造方法(无论隐式的还是显式的),则要求子类构造方法必须直接或间接指定调用父类哪个构造方法并且放在有效代码第一行super([参数列表]);
public class Father {
public Father(String name) {
System.out.println(name);
System.out.println("父类构造方法");
}
}
public class Son extends Father{
public Son() {
super("w");
System.out.println("子类构造方法");
}
}
public class Test {
public static void main(String[] args) {
new Son();
}
}
输出:
w
父类构造方法
子类构造方法
注意:一个类中只能默认有一个无参构造方法,此时若定义一个有参构造方法,则默认无参构造方法消失。
4.如果子类构造方法没有调用本类构造方法也没有指定调用父类构造方法则默认调用父类无参构造方法。
public class Father {
public Father() {
System.out.println("父类构造方法");
}
}
public class Son extends Father{
public Son() {
System.out.println("子类构造方法");
}
}
public class Test {
public static void main(String[] args) {
new Son();
}
}
输出结果:
父类构造方法
子类构造方法