- 如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法,如下代码:
此时有子类在继承父类时,第五行被注释掉的代码无论写还是不写,都会调用父类的无参构造方法。现在我们先看如下代码:
package com.jd.service;
public class Father {
public Father() {
super();//调用Object类中的构造方法
System.out.println("父类构造方法");
}
package com.jd.service;
public class Son extends Father{
public Son() {
//super();
System.out.println("子类构造方法");
}
public static void main(String[] args) {
new Son();
}
}
此时子类的代码执行结果应为“父类构造方法”“子类构造方法”,说明了super()为子类调用父类的无参构造方法,且这行代码是默认的,无论写不写都会执行。
- super(); 1、调用父类构造方法
2、super调用父类构造方法,该行代码必须放在有效代码行的第一行
3、如果一个构造方法没有调用本类中的其它构造方法,构造方法默认有一个super();
反之没有super(),但是如果被调用的构造方法没有调用本类其它构造方法,则该构造方法由super() - 上面关于super的几点,我们可以通过代码来证明:
需要先补充说明一点:如果父类中什么构造方法都没有,则默认为无参构造方法;如果父类里有一个有参构造方法,此时其默认的无参构造方法消失,这也就是为什么上述子类代码的第九行报错,原因就是这时在子类中被调用的此构造方法没有调用本类中的其他构造方法,则该构造方法默认有一个super(),而此时父类中已经没有了无参的构造方法,所以这里报错。
- 上述代码需要指出的是,this需要放在有效代码行的第一行,而super也需要,这里写出来了this,则super自动消失
package com.edu.zzu.test;
public class Father{
public Father() {
System.out.println("父类构造方法1");
}
public Father(double price) {
System.out.println("父类构造方法2");
}
public Father(String name) {
System.out.println("父类构造方法3");
}
}
package com.edu.zzu.test;
public class Son extends Father{
public Son() {
this(12);
System.out.println("子类构造方法");
}
public Son (int age) {
super();
System.out.println("");
}
public static void main(String[] args) {
new Son();
}
}
此时,该子类代码的执行结果为
- 此时,若想实现super()对父类无参或不同有参形式的精准调用,则需要在super()的()里写明无参或有参的具体类型
- 如果父类没有无参构造方法(无论隐式的还是显式的),则要求子类构造方法必须直接或间接指定调用父类哪个构造方法并且放在有效代码第一行,如下代码:
分析代码:此时子类中的第九行代码super(“”)是直接调用父类中的第二个构造方法,子类中的第五行代码this(12)则是间接调用父类中的第二个构造方法,先调用本类第一个有参构造方法,而第一个有参构造方法直接调用了父类第二个构造方法。
- 一句话:子类必须调用父类的构造方法。
- 构造方法只能用new来实现调用
package com.edu.zzu.test;
public class Son extends Father{
public Son() {
this(12);
System.out.println("子类构造方法1");
}
public Son (int age) {
super("");
System.out.println("子类构造方法2");
}
public static void main(String[] args) {
new Son();
}
}