Java中super关键字详解

在Java的基础学习中,慢慢接触到许多陌生的关键字,今天来讲一下我所认识的super关键字

它的使用场景为:有继承在⭐(必须在继承下才能使用super)


一.super调用(父类)构造方法

看下面这段代码

class Person{
    public Person(){
        System.out.println("1.Person类的构造方法");
    }
}

class Student extends Person{
    public Student(){
        super();  //可写可不写,不写系统会自动在子类无参构造前加上super();表示先调用父类的无参构造;
        System.out.println("2.Student类的构造方法");
    }
}

public class Day6{
    public static void main(String[] args){
        Student stu = new Student();
    }
}

打印结果为:
1.Person类的构造方法
2.Student类的构造方法

注意:

1.当父类存在无参构造时,当调用子类无参构造时,系统会自动在子类无参构造前加上super(),表示先调用父类的无参构造。 super语句可以省略此时子类可以使用this调用构造方法。

2.当父类不存在无参构造时(指父类一个无参构造方法都没),必须在子类构造方法中使用super(参数);
明确指定调用父类的哪个有参构造。此时super语句不能省略;且此时子类不存在this调用构造方法。

看下面这段代码:

class Person{
    private String name;
    private int age;
    public Person(String name){
        this.name = name;
    }
    public Person(String name, int age){
        this(name);   //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复
        this.age = age;
    }
    public Person(){
        System.out.println("1.Person类的构造方法");
    }
}

class Student extends Person{
    private String school;

    public Student(){
        super("yy");
        System.out.println("Student类的构造方法");
    }

    public Student(String school){
        this();
        //super("yy");    //对super的调用必须在构造方法的第一行
        System.out.println("2.Student类的构造方法");
    }
}

public class Day6{
    public static void main(String[] args){
        Student stu = new Student("beida");
    }
}

运行结果如下:
Student类的构造方法
2.Student类的构造方法

这个代码中父类含有无参构造方法所以在子类中可以使用this关键字来调用子类的构造方法,此时得省去super语句,免得跟this冲突,但省去后系统依旧会帮你加上,但不会报错,若不省去则会报错

若将上面代码改成如下:

class Person{
    private String name;
    private int age;
    public Person(String name){
        this.name = name;
    }
    public Person(String name, int age){
        this(name);   //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复
        this.age = age;
    }
}

class Student extends Person{
    private String school;
    public Student(){
        super("yy");
        System.out.println("Student类的构造方法");
    }
    public Student(String school){
        this();
        super("yy");   
        System.out.println("2.Student类的构造方法");
    }
}

public class Day6{
    public static void main(String[] args){
        Student stu = new Student("beida");
    }
}

可见父类中没有无参构造方法,但子类却使用了this调用构造方法,这是不允许的,所以会报错;


二.super调用普通方法 

super调用方法或属性都是指调用父类中的方法或属性
看下面简单的应用:

class Person{
    public String info = "father";
    public void print(){
        System.out.println("i am father");
    }

}
class Student extends Person{
    public Student(){
        super.print();
        System.out.println(super.info);   //不能super.父类的私有属性
    }

}
public class Exer{
    public static void main(String[] args){
        Student stu = new Student();
    }
}

将会输出:
i am father
father

 我们可以看到,其实super的使用方法和this关键字有很大的相似之处,但最大的区别就在于super是访问父类的操作而this是访问本类的操作!!

猜你喜欢

转载自blog.csdn.net/eternal_yangyun/article/details/85263542