Java中super关键字示例
时间:2020-01-09 10:34:51 来源:igfitidea点击:
Java中的super关键字用于引用子类的直接父类。我们可以通过以下方式在Java中使用超级关键字:
- 我们可以调用父类的构造函数,使用super可以使代码更紧凑,并且类可以更好地封装。参见示例。
- 我们还可以使用super关键字来访问已被子类隐藏的父类的字段或者方法。参见示例。
使用super调用超类的构造函数
为了了解如何使用Java中的super关键字来调用直接父类的构造函数,以及它如何有助于更好地封装和减少代码重复,首先让我们看一下未使用super的代码。
class A { int x; int y; public A(){ } A(int x, int y){ this.x = x; this.y = y; } } public class B extends A{ int z; public B(int x, int y, int z) { // x and y from parent class this.x = x; this.y = y; this.z = z; } public static void main(String[] args) { B obj = new B(5, 6, 7); System.out.println("x=" + obj.x + " y= "+ obj.y + " z= "+ obj.z); } }
输出:
x=5 y= 6 z= 7
在代码中,类B扩展了类A。如果我们注意到类B的构造函数再次初始化它从类A继承的字段(x和y)。在类A的构造函数中也进行了相同的初始化,从而导致代码重复。
这里的另一个问题是,由于必须在子类B中访问这些字段,因此无法将A类中的字段标记为私有字段,这意味着未正确封装A类。
使用超级关键字
让我们再看一个相同的例子,当使用super关键字调用父类的构造函数时。
class A { private int x; private int y; public A(){ } A(int x, int y){ this.x = x; this.y = y; } } public class B extends A{ int z; public B(int x, int y, int z) { //invoking parent class constructor super(x, y); this.z = z; } public static void main(String[] args) { } }
在代码中,我们可以看到super用于调用父类的构造函数,该构造函数初始化父类中的字段。这样,可以将x和y字段标记为私有,因此A类具有更好的封装。同样,在类B的构造函数中不需要相同的初始化,因此无需重复代码。
请注意,对super()的调用必须是子类构造函数中的第一个语句,否则将出现编译错误"构造函数调用必须是构造函数中的第一个语句"。
使用super访问父类的字段和方法
Java中super关键字的另一种用法是访问父类的字段或者方法。在子类中,如果我们具有与父类同名的字段或者方法,则子类成员将覆盖同名的父类成员。在这种情况下,如果要访问父类的成员,则可以使用super关键字。
范例程式码
在示例中,类A中有一个display()方法,子类B中又有一个display()方法,它覆盖了父类的方法。如果要调用类A的显示方法,则要显示类A的字段,可以使用super关键字来完成。
class A { private int x; private int y; public A(){ } A(int x, int y){ this.x = x; this.y = y; } public void display() { System.out.println("In display method of super class"); System.out.println("x= " + x + " y= " + y); } } public class B extends A{ int z; public B(int x, int y, int z) { //invoking parent class constructor super(x, y); this.z = z; } public void display() { // invoking display method of parent class super.display(); System.out.println("In display method of child class"); System.out.println("z= " + z); } public static void main(String[] args) { B obj = new B(5, 6, 7); obj.display(); } }
输出:
In display method of super class x= 5 y= 6 In display method of child class z= 7