super 是 Java 的一个关键字,本身并不表示某个父类对象
super 是一个引用,指向当前对象的父类(或超类)的部分
super 可以出现在构造方法、实例方法中,但不可以出现在类方法中
一、子类构造方法中,调用父类的构造方法
子类所有构造方法中默认赠送一个super();
父类构造方法先执行,子类构造方法再执行
父类没有无参构造方法时,子类构造方法中必须显示使用super调用父类构造方法
super(…) 和 this(…) 只能出现构造方法中,必须是构造方法的第一个语句,两者不共存
// 父类
public class Fu {
public Fu() {
System.out.println("Fu constructor execute...");
}
}
// 子类
public class Zi extends Fu {
public Zi() {
System.out.println("Zi constructors execute...");
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
二、子类实例方法中,访问隐藏的成员变量和方法
如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法
静态成员不会被继承,子类可以重新定义静态成员,这被称为隐藏(hiding)
【成员变量隐藏】:子类成员变量的名字和父类成员变量的名字相同,声明的类型可以不同
【成员方法隐藏】:子类定义一个与父类具有相同名称和参数列表的方法,子类方法将隐藏父类方法
// 父类
public class Fu {
int num = 10;
static String str = "hello";
public void methodInstance() {
System.out.println("Fu methodInstance...");
}
public static void methodStatic() {
System.out.println("Fu methodStatic...");
}
}
// 子类
public class Zi extends Fu {
// 成员变量隐藏
double num = 20;
static String str = "world";
// 成员方法隐藏
@Override // 实例方法重写
public void methodInstance() {
System.out.println("Zi methodInstance...");
}
// @Override // 静态方法不存在重写,只能隐藏
public static void methodStatic() {
System.out.println("Zi methodStatic...");
}
public void methodZi() {
System.out.println(num);
System.out.println(str);
System.out.println(super.num);
// System.out.println(super.str); // hello
System.out.println(Fu.str); // 推荐使用类名访问静态成员
methodInstance();
super.methodInstance();
methodStatic();
// super.methodStatic(); // Fu methodStatic...
Fu.methodStatic(); // 推荐使用类名访问静态成员
}
public static void main(String[] args){
Fu fu = new Zi(); // 向上转型
// 【静态成员属于类,而不是类的实例】
fu.methodStatic(); // Fu methodStatic...
Zi.methodStatic(); // Zi methodStatic...
}
}