super关键字的用法

1. super表示父类属性

一般没有意义,因为属性会被 private 封装,被 private 封装的属性是不能调用的。

语法:super.属性名称,明确表示从父类中查找属性

class Person {
    public String info = "父类";
}
class Student extends Person {
    public String info = "子类";
    public void fun() {
        System.out.println(super.info);
        System.out.println(this.info);
    }
}
public class SuperDiaoYongFuLeiShuXing {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.fun();
    }
}

在这里插入图片描述
super.info 表示的父类中的属性,而 this.info 表示的是本类中的属性,此时的本类指的是 student 子类。

2. super表示父类方法

① 表示父类构造方法

语法:super(方法参数);

调用父类无参构造时,子类构造方法首行的super();可以省略;当父类不存在无参构造时,子类构造方法必须使用super(方法参数);明确表示当前调用的是哪个父类构造,此时super不能省略,且必须处于子类构造方法首行,此时子类不存在this构造器调用!!!

  • 调用父类无参构造
class Person {
    public Person() {
        System.out.println("Person类对象产生");
    }
}
class Student extends Person {
    public Student() {
        // 此句在无参构造时写与不写一样
        super();
        System.out.println("Student类对象产生");
    }
}
public class SuperBiaoShiFuLeiGouZaoFangFa {
    public static void main(String[] args) {
        new Student();
    }
}

在这里插入图片描述
因为这个是构造方法,实例化子类对象之前一定会先实例化父类对象,即先调用父类构造方法再调用子类构造方法,所以无论有没有super,这里的结果都是两个。

  • 调用父类有参构造

注意:语法是super(方法参数);,并没有参数类型!!!

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("姓名是:"+name+", 年龄是:"+age);
    }
}
class Student extends Person {
    private String school;
    public Student(String name, int age, String school) {
        super(name, age);
        this.school = school;
        System.out.println("学校是:"+school);
    }
}
public class SuperBiaoShiFuLeiGouZaoFangFa {
    public static void main(String[] args) {
        new Student("张三", 20, "清华");
    }
}

在这里插入图片描述
② 表示父类被覆写的方法

语法:super.方法名(方法参数);

class Person {
    public void print() {
        System.out.println("父类");
    }
}
class Student extends Person {
    public void print() {
        super.print();
        System.out.println("子类");
    }
}
public class SuperDiaoYongFuLeiBeiFuXieDeFangFa {
    public static void main(String[] args) {
        new Student().print();
    }
}

在这里插入图片描述
print() 这个方法被子类覆写了,子类的 print() 方法中没有没有 super 构造器调用,是不会打印出 “父类” 这个结果的,如果有了 super 构造器调用则super 此时就会表示父类的被覆写的方法。

3. this 和 super 的区别

在这里插入图片描述
能使用super.方法();一定要明确记住是父类的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值