【JAVA】(继承)super关键字

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);
    }
}

打印结果:

子类中无参构造方法被调用
子类中带参构造方法被调用

猜你喜欢

转载自blog.csdn.net/joker_Ling/article/details/107761629