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