super关键字用法

super关键字作用:在子类内部调用父类对象
基础语法
1.在类的继承中,当子类继承了父类, 在构造子类的时候,一定要先帮助父类进行构造
2. 调用super()必须写在子类构造方法的第一行,以保证在执行任何动作前,对象已经完成了初始化,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

super关键字的三种用法:

1. super.成员变量


class Person{
    
    
    public String name; //成员变量
    public Person(String name) {
    
    
        this.name = name;
    }
}
class Student extends Person{
    
    
    String name = "student";
    public Student(String name) {
    
    
        super(name);
    }
    public void help() {
    
    
        //调用父类的成员属性
        System.out.println(name); //student 直接使用,优先使用局部变量
        System.out.println(super.name); // B 直接使用父类的成员变量
    }
}
public class s {
    
    
    public static void main(String[] args) {
    
    
        Student p = new Student("B");
        p.help();
    }
}

2. super.成员方法


class {
    
    
    public String name;
    public Person(String name) {
    
    
        this.name = name; //Test
    }
    public void help() {
    
    
        System.out.println(this.name+"Person");
    }
}
class Student extends Person{
    
    
    String name = "student";
    public Student(String name) {
    
    
        super(name); //Test
    }
    public void help() {
    
    
        //调用父类的成员方法
        super.help();
        System.out.println(this.name+"Student"); //Student this调用的式同类中的变量
    }
}
public class s {
    
    
    public static void main(String[] args) {
    
    
        Student p = new Student("Test");
        p.help();
    }
}
//Test Person
//student Student

3. super():调用父类中的构造方法

3.1.1 隐式调用父类无参数构造方法super()

如果父类是无参构造,那么子类的构造方法会默认隐式的在第一行先调用父类无参数构造方法,所以super()无需手动进行调用;

public class Father{
    
    
    int id;
    public Father(){
    
    
        System.out.println("父类构造方法");
    }
}
public class Son extends Father{
    
    
    public Son(){
    
    
    	//super(); //系统会默认生成,可有可无
        System.out.println("子类构造方法");
    }
}
public class Test{
    
    
    public static void main(String[] args){
    
    
        Son s = new Son();
    }
}

//print:
//父类构造方法
//子类构造方法

3.1.2 显式调用父类有参数构造方法super(id)

如果父类是含参构造,那么此时因为父类中没有无参数构造方法,所以子类继承父类时会报错,这时就需要我们手动的调用父类的有参构造方法super(id);

public class Father{
    
    
    int id;
    public Father(int id){
    
    
        System.out.println("父类构造方法");
    }
}
public class Son extends Father{
    
    
    public Son(int id){
    
    
    	super(id); //手动调用父类的有参构造方法
        System.out.println("子类构造方法");
    }
}
public class Test{
    
    
    public static void main(String[] args){
    
    
        Son s = new Son(1);
    }
}

//print:
//父类构造方法
//子类构造方法

Guess you like

Origin blog.csdn.net/Emperor10/article/details/121456588