Java中的super关键字

一、super关键字是干什么的?

简单来说,就是子类中重写的方法,既需要调用父类的方法,又需要再额外增加一些自己的东西。已经在Java的继承这篇文章中使用过super关键字了。

简单来说:super代表父类的引用,用于访问父类的属性,方法和构造器。

abstract class Report{
    void setReport(){
        //设置报告
    }
    void printReport(){
        //打印报告
    }
}

class sonReport extends Report{
    @override
    void setReport(){
        super.setReport();   //使用super关键字调用父类的setReport()方法,调用完后再继续往下走。
        myselfReportMethod();
        printReport();
    }
}

二、super关键字详解

  1. super关键字访问父类的属性,但是不能访问父类的private属性。super.属性名;(属性就是父类中的实例变量。在子类中,从父类那继承来的实例变量的值是可以修改的,只要不是private)
  2. super关键字访问父类的方法,但是不能访问父类的private方法。super.方法名(参数列表);
  3. 访问父类的构造器。super(参数列表); 只能放在构造器第一句(这点和this关键字一样),且只能出现一句。

三、用super关键字的好处

1、能够分工明确,父类属性由父类初始化,子类属性由子类初始化。

class computer{
    String cpu;
    int memory;
    int disk;
}

public class PC extends Computer{
    private String brand;
    
    public PC(String cpu, int memory, int disk, String brand){
        super(cpu, memory, disk);
        this.brand = brand;
    }
}

2、如果子类中的成员有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,用super, this和直接调用是一样的效果。例如:下面的代码,如果子类中没有重名的方法,那他们效果是一样的,都是调用父类中的cal方法,但是如果子类PC中也有一个cal方法,那么直接调用和this.cal()就是调用的子类PC中的cal方法,而super.call()还是调用父类Computer中cal方法。

使用父类可访问方法的三种方式:(访问属性和方法的这个顺序一样)

class Computer{
    String cpu;
    int memory;
    int disk;
    int i = 100;

    public void cal(){
        
    }
}

public class PC extends Computer{
    private String brand;
    int i = 888;
    
    public PC(String cpu, int memory, int disk, String brand){
        super(cpu, memory, disk);
        this.brand = brand;
    }
    
    public void sum(){
        //想要在这里调用cal方法
        //第一种方式:直接调用
        //这种方式它会向上去找cal方式,顺序是:
        //(1) 先找本类,如果有就调用
        //(2) 如果没有,就向上去找父类(如果有,并可以调用(private的就不可以调用),就调用)
        //(3) 如果父类没有,则继续去找父类的父类,一直向上,直到找到object类。
        //注意:如果在查找方法的过程中找到了,但是不能访问,是会报错的。没有找到,提示方法不存在
        cal();
        
        //第二种方式:this
        //this.call和上面的第一种是完全等价的,查找顺序也是完全一样的
        this.call();

        //第三种方式:super
        //与上面两种方式不同,它没有第一步,而是直接从第二步开始去找父类的,其他的都一样。哪怕自己的子类有一个cal方法,他也不会去调用。
        super.call();

        sout(i);   //---> 888
        sout(this.i);   //---> 888
        sout(super.i);   //---> 100
    }
}

四、super和this的比较

super关键字和this关键字很相似,但super关键字是用于访问父类,this关键字是用于访问本类。

Fig.1 super关键字和this关键字的比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m1m-FG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值