super
super关键字的用法和this关键字用法相似
**this:**代表本类对象的引用
**super:**代表父类存储空间的标识(可以理解为父类对象引用)
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this[访问本类成员变量,构造方法,成员方法] | this.成员变量; | this(…) | this.成员方法(…) |
super[访问父类成员变量,构造方法,成员方法] | super.成员变量 | super(…) | super.成员方法(…) |
this在之前的文章中已经介绍过了,这里介绍继承中super的使用方法。
首先创建Fu类,Zi类和main:
public class Fu {
public Fu(){
System.out.println("Fu类中无参构造方法被调用");
}
public Fu(int age){
System.out.println("Fu类中带参构造方法被调用");
}
}
public class Zi extends Fu {
public Zi(){
System.out.println("子类中无参构造方法被调用");
}
public Zi(int age){
System.out.println("子类中带参构造方法被调用");
}
}
public class SuperTest {
public static void main(String[] args) {
Zi z = new Zi();
Zi z1 = new Zi(2);
}
}
打印结果:
Fu类中无参构造方法被调用
子类中无参构造方法被调用
Fu类中无参构造方法被调用
子类中带参构造方法被调用
可以看到创建出子类的无参,有参构造方法时,都会优先打印出父类中的无参构造方法,这是因为: 子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化;并且,每一个子类构造方法的第一条语句默认都是super()【这里理解为先访问父类中的无参构造方法】
注意:如果父类中没有无参构造方法,调用子类时找不到父类中的无参方法会报错,当只有带参构造方法时,有两种方法可以解决错误。第一种通过super关键字去显示的调用父类的带参构造方法;第二种在父类中自己提供一个无参构造方法。推荐使用自己给出无参构造方法
第一种通过super()在子类中调一下带参:
public class Fu {
/*
public Fu(){
System.out.println("Fu类中无参构造方法被调用");
}
*/
public Fu(int age){
System.out.println("Fu类中带参构造方法被调用");
}
}
public class Zi extends Fu {
public Zi(){
super(10);
System.out.println("子类中无参构造方法被调用");
}
public Zi(int age){
super(12);
System.out.println("子类中带参构造方法被调用");
}
}
public class SuperTest {
public static void main(String[] args) {
Zi z = new Zi();
Zi z1 = new Zi(2);
}
}
显示结果:
Fu类中带参构造方法被调用
子类中无参构造方法被调用
Fu类中带参构造方法被调用
子类中带参构造方法被调用
第二种自己在父类中构造一个无参:
public class Fu {
/*
public Fu(){
System.out.println("Fu类中无参构造方法被调用");
}
*/
public Fu(){}
public Fu(int age){
System.out.println("Fu类中带参构造方法被调用");
}
}
public class Zi extends Fu {
public Zi(){
// super(10);
System.out.println("子类中无参构造方法被调用");
}
public Zi(int age){
// super(12);
System.out.println("子类中带参构造方法被调用");
}
}
public class SuperTest {
public static void main(String[] args) {
Zi z = new Zi();
Zi z1 = new Zi(2);
}
}
打印结果:
子类中无参构造方法被调用
子类中带参构造方法被调用