0%

java中的super关键字

super关键字

super关键字具有以下作用:

  1. 调用父类的成员或方法
  2. 调用父类的构造函数

调用父类的构造函数

使用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方法后,就会在控制台打印出

1
2
父类中的方法
子类中的方法

那么问题来了,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();
}
}

最后打印的是什么?

1
2
Son
Son

也许你会觉得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类名了。