java系列:super

95 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

super

基本介绍

super代表父类的引用,用于访问父类的属性,方法,构造器

基本语法

com.gaogao.super_包下 Super01.java

package com.gaogao.super_;
​
public class A extends Base {
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
​
    private int n4 = 400;
​
    public A() {
​
    }
​
    public A(String name) {
​
    }
​
    public A(String name, int age) {
​
    }
​
    public void cal() {
        System.out.println("A类的cal方法");
    }
​
    public void test100() {
​
    }
​
    protected void test200() {
​
    }
​
    void test300() {
​
    }
​
    private void test400() {
​
    }
​
}
package com.gaogao.super_;
​
public class B extends A{
    //访问父类的属性,按hi不能访问问父类的private属性
    // super.属性名
    public  void hi(){
        System.out.println(super.n1 + " " + super.n2 + " " +  super.n3);
    }
​
    public void sum(){
        System.out.println("B类的sum方法");
        //希望调用父类A的cal方法
        //这时,因为子类B没有cal方法,因此我可以使用下面三种方式
        //
        cal();//找calc方法时,顺序是,先找本类,如果有,则调用,如果没有,
        // 则找父类(并且可调用则调用,如果没有则继续向上直到Object)
        this.cal();//等价cal();
        super.cal();//super.cal();会直接跳过本类去寻找父类,其他规则一样
        
​
​
    }
​
​
    public void ok(){
        super.test100();
        super.test200();
        super.test300();
//        super.test400();   会报错,因为test400时私有方法
    }
​
​
}
package com.gaogao.super_;
​
public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        b.sum();
    }
}
  1. 访问父类的属性,但是不能访问父类的private属性super.属性名;
  2. 访问父类的方法,不能访问父类的private方法super.方法名(参数列表)
  3. 访问父类的构造器(前面用的就是):super(参数列表)只能放在构造器的第一句,只能出现一句

使用细节

superDetail.java

  1. 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
  2. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super,this,直接访问是一样的效果!
  3. super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级)中都有同名成员,使用super访问遵循就近原则A->B->C。当然,也需要遵守访问权限相关规则

super和this的比较

  1. 访问属性:this访问本类中的属性,如果本类没有此属性则从父类中继续查找,super访问父类及以上中的属性
  2. 调用方法:this访问本类中的方法,如果奔雷没有此方法,则从父类继续查找,super则直接调用父类中的方法
  3. 调用构造器:this调用本类的构造器,必须放在构造器的首行。super调用父类构造器,必须放在子类构造器的首行
  4. 特殊:this表示当前对象,super表示子类中访问父类对象