开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
}
}
- 访问父类的属性,但是不能访问父类的private属性super.属性名;
- 访问父类的方法,不能访问父类的private方法super.方法名(参数列表)
- 访问父类的构造器(前面用的就是):super(参数列表)只能放在构造器的第一句,只能出现一句
使用细节
superDetail.java
- 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
- 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super,this,直接访问是一样的效果!
- super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级)中都有同名成员,使用super访问遵循就近原则A->B->C。当然,也需要遵守访问权限相关规则
super和this的比较
- 访问属性:this访问本类中的属性,如果本类没有此属性则从父类中继续查找,super访问父类及以上中的属性
- 调用方法:this访问本类中的方法,如果奔雷没有此方法,则从父类继续查找,super则直接调用父类中的方法
- 调用构造器:this调用本类的构造器,必须放在构造器的首行。super调用父类构造器,必须放在子类构造器的首行
- 特殊:this表示当前对象,super表示子类中访问父类对象