Java super的3种用法(附带实例)
在 Java 程序中,当子类继承父类后,有时候需要访问父类的一些成员变量或方法,这时可以使用 super 关键字来调用这些成员变量或方法。
super关键字的用法有 3 种,分别是:
1) 在子类的构造方法中,访问父类的构造方法。语法格式如下:
2) 在子类的成员方法中,访问父类的成员变量。语法格式如下:
3) 在子类的成员方法中,访问父类的成员方法。语法格式如下:
那么,当父类中有多个构造方法时,如何才能调用父类中的某个特定构造方法呢?
Java 语言出于安全性的考虑,对于对象的初始化要求是非常严格的。例如,Java 要求一个父类的对象要在子类运行前完全初始化。
super 关键字可以用于在子类构造方法中调用父类的构造方法:
接下来,通过一个案例演示 super 关键字访问父类构造方法。
第 32 行代码调用 Dog 类的无参构造方法 Dog(),该构造方法会自动调用父类中对应的无参构造方法 Animal(),然后再执行自己的构造方法 Dog()。
第 35 行代码调用子类带 3 个参数的构造方法,该方法通过子类的有参构造方法语句 super(name,age) 调用父类的有参构造方法(第 7 行)。如果第 23 行代码不在子类构造方法的首行,则会编译报错“Call to 'super()' must be first statement in constructor body”,中文含义为“对 super 的调用必须是构造器中的第 1 个语句”,因为在程序里面先执行的是子类的操作,而后才是父类初始化过程,这明显是不对的。
接下来,通过一个案例来演示 super 访问父类的成员变量和成员方法。
同样,由于父类的 show() 方法声明为 public 的(第 10 行),所以可以在子类的普通方法中使用 super 关键字来调用(第 25 行)。
super关键字的用法有 3 种,分别是:
1) 在子类的构造方法中,访问父类的构造方法。语法格式如下:
super([参数列表])
2) 在子类的成员方法中,访问父类的成员变量。语法格式如下:
super.成员变量
3) 在子类的成员方法中,访问父类的成员方法。语法格式如下:
super.成员方法([实参列表])
Java super访问父类构造方法
在 Java 程序中,即使没有指明子类调用父类的构造方法,程序执行时还是会先调用父类中的无参构造方法,以便进行成员初始化操作。那么,当父类中有多个构造方法时,如何才能调用父类中的某个特定构造方法呢?
Java 语言出于安全性的考虑,对于对象的初始化要求是非常严格的。例如,Java 要求一个父类的对象要在子类运行前完全初始化。
super 关键字可以用于在子类构造方法中调用父类的构造方法:
- 如果在子类的构造方法中没有明确调用父类的构造方法,则在执行子类的构造方法时会自动调用父类的默认无参构造方法;
- 如果在子类的构造方法中调用了父类的构造方法,则调用语句必须出现在构造方法的首行。
接下来,通过一个案例演示 super 关键字访问父类构造方法。
class Animal { // 动物类 private String name; private int age; public Animal() { System.out.println("调用了动物类的无参构造方法"); } public Animal(String name, int age) { System.out.println("调用了动物类的有参构造方法"); this.name = name; this.age = age; } public void show() { System.out.println("名字:" + name + ", 年龄: " + age); } } class Dog extends Animal { // 动物类的子类Dog类 String color; public Dog() { // 子类无参构造方法 System.out.println("调用了狗类的无参构造方法"); } public Dog(String name, int age, String c) { // 子类有参构造方法 super(name, age); // 调用父类的有参构造方法 color = c; System.out.println("调用了狗类的有参构造方法"); System.out.println(color + "的狗狗"); } } public class Demo { public static void main(String[] args) { Dog d1 = new Dog(); d1.show(); System.out.println("----------------------"); Dog d2 = new Dog("花花", 8, "黄色"); d2.show(); } }程序的运行结果如下:
调用了动物类的无参构造方法
调用了狗类的无参构造方法
名字:null,年龄:0
----------------------
调用了动物类的有参构造方法
调用了狗类的有参构造方法
黄色的狗狗
名字:花花,年龄:8
第 32 行代码调用 Dog 类的无参构造方法 Dog(),该构造方法会自动调用父类中对应的无参构造方法 Animal(),然后再执行自己的构造方法 Dog()。
第 35 行代码调用子类带 3 个参数的构造方法,该方法通过子类的有参构造方法语句 super(name,age) 调用父类的有参构造方法(第 7 行)。如果第 23 行代码不在子类构造方法的首行,则会编译报错“Call to 'super()' must be first statement in constructor body”,中文含义为“对 super 的调用必须是构造器中的第 1 个语句”,因为在程序里面先执行的是子类的操作,而后才是父类初始化过程,这明显是不对的。
Java super访问父类成员变量和成员方法
在子类中使用 super 关键字除了可以访问父类的构造方法外,还可以访问父类的成员变量和成员方法,但是 super 关键字不能访问子类的成员。接下来,通过一个案例来演示 super 访问父类的成员变量和成员方法。
class Animal { protected String name; protected int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } public void show() { System.out.println("父类名字:" + name + ", 年龄: " + age); } } class Dog extends Animal { String color; int age = 10; public Dog(String xm, int age, String c) { super.name = xm; super.age = age; color = c; } public void show() { System.out.println("子类Dog中的成员变量age:" + age); super.show(); // 调用父类的show()方法 System.out.println("子类Dog, " + color + "的狗狗"); } } public class Demo { public static void main(String[] args) { Dog d1 = new Dog("花花", 11, "黄色"); d1.show(); } }程序的运行结果如下:
子类Dog中的成员变量age:10
父类名字:花花,年龄:11
子类Dog,黄色的狗狗
同样,由于父类的 show() 方法声明为 public 的(第 10 行),所以可以在子类的普通方法中使用 super 关键字来调用(第 25 行)。