一起养成写作习惯!这是我参与「掘金日新计划 · 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的区别
注意:
- this() 和super() 不能存在于同一个构造函数中。 原因:1、this()和super()都必须位于在构造函数的第一行;2、this()语句调用的是当前类的另一个构造函数,而此造函数中必然有一个父类的构造器(隐式),再使用super()又调用一次父类的构造器,这样一来就调用了两次父类的构造器,无法编译通过。
- this和super不能用于static修饰的变量、方法、代码块。 原因:this和super都指的是实例化对象。