super 关键字主要有三个作用:
- 从子类访问父类的成员变量
- 从子类访问父类的成员方法
- 从子类构造器访问父类的构造器
下面我将从这三个方面做一些细节说明和注意事项。
从子类访问父类的成员变量
使用 super 关键字从子类访问父类的成员变量需要遵循访问修饰符的限制。如下图所示,父类的私有变量子类是无法访问到的,其他类型的变量也都有一定的作用域。
从子类访问父类的成员方法
使用 super 关键字从子类访问父类的成员方法需要遵循访问修饰符的限制。如下图所示,父类的私有方法子类是无法访问到的,其他类型的方法也都有一定的作用域。
从子类构造器访问父类的构造器
使用 super 关键字从子类构造器访问父类的构造器我们需要注意以下两点:
- 在子类构造器中使用 super() 调用父类中的其他构造器时,该语句必须处于构造器的首行,否则编译器会报错。
- 子类构造器如果没有显示使用 super() 调用父类的构造器,那么会默认调用 super() 的无参构造器。
下面我会写一些案例来帮助理解以上两点注意事项。
-
父类有一个 public 无参构造器,代码如下:
public class Parent { public Parent() { System.out.println("我是父类的无参构造器"); } } public class Son extends Parent { public Son() { super(); System.out.println("我是子类的无参构造器"); } public static void main(String[] args) { Son son = new Son(); } }
控制台输出如下:
我是父类的无参构造器 我是子类的无参构造器
-
父类有一个 public 有参构造器,代码如下:
public class Parent { public Parent(int a) { System.out.println("我是父类的有参构造器,参数为" + a); } } public class Son extends Parent { public Son() { super(6); System.out.println("我是子类的无参构造器"); } public static void main(String[] args) { Son son = new Son(); } }
控制台输出如下:
我是父类的有参构造器,参数为6 我是子类的无参构造器
-
父类只有一个 private 无参构造器
如果父类只有一个 private 无参构造器,那么子类在创建子类构造器时会报错。因为子类构造器在创建时一定要调用一个父类构造器(无论是显示调用还是隐式调用都可以),但父类只有一个 private 无参构造器,而这个构造器因为是 private 的,所以子类是访问不到的,也就是说子类没有可以调用的父类构造器,所以会报错。
注意
super 关键字不能用在 static 方法中。因为 super 代表对父类对象的引用,指向父类对象,而静态方法是属于类范畴的东西。