super 关键字
基本介绍
super 代表父类的引用,用于访问父类的属性、方法、构造器
基本语法
//com.edu.super_ 下 Super.java
-
访问父类的属性,但不能访问父类的private属性[案例] super.属性名;
-
访问父类的方法,不能访问父类的private方法 super.方法名(参数列表);
-
访问父类的构造器(这点前面用过): super(参数列表);只能放在构造器的第一句,只能出现一句!
super 给编程带来的便利/细节
//SuperDetail.java
-
调用父类的构造器的好处 (分工明确,父类属性由父类初始化,子类的属性由子 类初始化)
-
当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须 通过super。如果没有重名,使用super、this、直接访问是一样的效果!
public class B extends A{
//访问父类的属性,但不能访问父类的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方法因此我们可以使用三种方法
//1.第一种方法super.cal()
//cal();
//这里找cal方法,对应的顺序是:
//(1)先找本类如果有,就调用
//(2)如果本类没有就去找父类,父类有且可以调用就调用
//(3)若父类没有则继续寻找父类的父类,一致按照这样的规则找到object类
//提示: 假设寻找方法的过程之中 ,找到了 ,但是不可访问 ,就会报错(cannot access)
// 如果查找的方法的过程当中 ,没有找到 ,则提示方法不存在
//2.第二种方法this.cal()
//该方法和cal方法一个意思(等价 call)
//3.第三种方法super.cal()
//跳过了cal()的第一个过程直接跳到了找父类的cal
//表示找的是super的cal方法 ,其余的规则是一样的
//需要知道的是 ,不仅仅是方法按照这个规则 ,属性的调用也是按照这个规则
}
//访问父类的方法,不能访问父类的private方法
//super.方法名(参数列表);
public void ok(){
super.test100();
super.test200();
super.test300();
}
//访问父类的构造器(这点前面用过):
//super(参数列表);只能放在构造器的第一句,只能出现一句!
public B(){
super("jack",10);
//此时调用的就是父类的有参构造器
}
}
-
super的访问不限于直接父类 ,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员 ,如果基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C ,同时还要遵循访问权限的相关原则
super和this的比较
| no. | 区别点 | this | super |
|---|---|---|---|
| 1 | 访问属性 | 访问本类中的属性 ,如果本类没有此属性则从父类中继续查找 | 从父类开始查找属性 |
| 2 | 调用方法 | 访问本类中的方法 ,如果本类没有类中的属性 ,如果本类没有此属性则从父类中继续查找 | 从父类开始查找方法 |
| 3 | 调用构造器 | 调用本类的构造器 ,必须放在构造器的首行 | 调用父类的构造器 ,必须放在子类构造器的首行 |
| 4 | 特殊 | 表示当前对象 | 子类中访问父类对象 |
学习完继承之后 ,类的定义进一步有所完善
package 包名;
class 类名 extends 父类{
成员变量(属性);
构造方法(构造器);
成员方法(成员函数);
}

浙公网安备 33010602011771号