super关键字
super关键字具有以下作用:
- 调用父类的成员或方法
- 调用父类的构造函数
调用父类的构造函数
使用super关键字可以调用父类的构造函数
1 2 3 4 5 6 7 8 9 10 11
| public class Parent{ public String name;
public Parent(){ // 父类的无参构造函数 }
public Parent(String name){ this.name = name; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Son extends Parent{ public Son(){
}
public Son(String name){ super(name); }
public static void main(String[] args){ Son son = new Son("jack"); System.out.println(son.name); // 打印jack } }
|
通过super()调用父类构造器必须放在构造函数第一行。
通过super(),父类的无参构造函数会被执行,通过super(parameter list),父类中的带参数构造函数会被执行。
如果子类构造函数中没有显式调用父类构造器,则jvm默认调用父类的无参构造函数,如果父类中没有无参构造函数,则报错。
调用父类中的方法
现在在Parent类中添加一个方法
1 2 3
| public void parentMethod(){ System.out.println("父类中的方法"); }
|
子类中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Son extends Parent { public Son(){}
public Son(String name) { super(name); }
public void showParentMethod(){ super.parentMethod(); this.parentMethod(); } // 为了显示super调用父类的方法,这里重写了父类的方法 public void parentMethod(){ System.out.println("子类中的方法"); }
public static void main(String[] args){ Son son = new Son(); son.showParentMethod(); } }
|
调用Son类中的main方法后,就会在控制台打印出
那么问题来了,super关键字是不是就可以认为是Parent对象的一个引用了?
super是指向父类对象的引用?
回答问题前先来看一下下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Son extends Parent { public Son(String name) { super(name); }
private int age;
public Son(){}
public void show(){ System.out.println(super.getClass().getName()); System.out.println(this.getClass().getName()); }
public static void main(String[] args){ Son son = new Son(); son.show(); } }
|
最后打印的是什么?
也许你会觉得super.getClass().getName()
会返回Parent类的名字,可惜不凑巧,你想错了。
为什么super.getClass().getName()会返回子类的名字,super.parentMathod()却可以调用父类的方法?
其实super在类中并不是父类对象的引用,程序中是不能使用System.out.println(super)
打印出super,只是具有调用父类方法的功能。而getClass()方法是Object类的方法,并且是final的,在调用时返回对象在运行时的类的类型。super.getClass()和this.getClass()都是在Son类中调用Object类的getClass()方法,这也就解释了为什么super.getClass().getName()返回的是Son类名了。