详解super关键字

193 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

super是指父类或者超类的引用。super关键字代表的就是“当前对象”的父类型特征。

一、super的用法

1. 访问父类的属性

使用方式:super.父类属性,但是不用访问父类的私有属性;

2. 访问父类的方法

使用方式:super.父类方法(参数列表),但是不用访问父类的私有方法;

3. 访问父类的构造方法

使用方式:super(参数列表),但是要放在构造的第一行;通过当前构造方法构造出父类构造方法。目的是为啦实例化子类对象前,初始化父类的特性。

示例代码: 父类Person

package com.java.yanf.base;

import lombok.Data;

@Data
public class Person {
    private String name;
    private int age;

    //无参构造函数
    public Person() {
    }

    public Person(String name) {
        //成员变量和局部变量重名,可以用关键字this区分
        this.name = name;
    }

    public Person(String name, int age) {
        //this调用本类的构造方法,必须放在第一行,因为初始化动作要先执行,等效于this.name = name;
        this(name);
        this.age = age;
    }

    public void say() {
        //this调用本类的成员属性
        System.out.println(this.name + ":" + this.age);
    }

}

子类Girl



package com.java.yanf.base;

import lombok.Data;

@Data
public class Girl extends Person {
    private String finger;

    public Girl(){
    //此处隐式调用了super()
    }
    
    public Girl(String finger) {
        //调用父类构造方法,放在构造器一行
        super(name);
        this.finger = finger;
    }

    public void say() {
        //访问父类方法,同名时,super不能省略;
        super.say();
        //访问父类
        System.out.println(this.finger + super.getName());
    }
}

二、this与super的区别

image.png

注意:

  • this() 和super() 不能存在于同一个构造函数中。 原因:1、this()和super()都必须位于在构造函数的第一行;2、this()语句调用的是当前类的另一个构造函数,而此造函数中必然有一个父类的构造器(隐式),再使用super()又调用一次父类的构造器,这样一来就调用了两次父类的构造器,无法编译通过。
  • this和super不能用于static修饰的变量、方法、代码块。 原因:this和super都指的是实例化对象。