Java面向对象软件开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.4 super关键字

当对父类实施成员覆盖以后,如果仍然需要使用父类的同名方法怎么办?这就要使用super关键字。super表示当前对象的直接父类对象。super的使用方法有以下三种:

(1)用来访问直接父类中被隐藏的数据成员。其使用形式如下:

super.数据成员

(2)用来访问直接父类中被重写的成员方法。其使用形式如下:

super.成员方法

(3)用来调用直接父类的构造方法。其使用形式如下:

super ([参数列表])

特别提示:

如果父类的构造方法为有参构造方法,则子类的构造方法中必须用super ([参数列表])给父类传参。

例2-7】 在子类B中定义了与父类同名的属性z和方法display(),从而隐藏了父类同名成员,但在子类中又要求能调用到父类的方法和属性。

                                  // 父类A
          class A {
              int x, y;
              int z = 100;
              public A(int x,int y){     // 构造方法
                  this.x = x;
                  this.y = y;
              }
              public void display() {
                  System.out.println("In class A: x= " + x + " , y= " + y);
              }
          }
                                  // 子类B,继承于父类A
          class B extends A {
              int a, b;
              int z=200;            // 在子类中定义与父类同名变量z
              public B(int x,int y,int a,int b){              // 构造方法
                  super(x,y);         // 调用父类的构造方法,必须是子类构造方法的第一个可执行语句
                  this.a = a;
                  this.b = b;
              }
              public void display(){     // 重写父类的display()方法
                  super.display();      // 调用父类中被重写的方法
                  System.out.println("In class B: a= " + a + " , b= " + b);
                  System.out.println("Subclass B:"+z);       // 直接输出为子类变量
                  System.out.println("Superclass A:"+super.z); // 访问父类变量
              }
          }
          public class SuperDemo {
              public static void main(String[] args) {
                  B a = new B(1, 2, 3, 4);
                  a.display();
              }
          }

该程序的运行结果如下:

            In class A: x= 1 , y= 2
            In class B: a= 3 , b= 4
            Subclass B: 200
            Superclass A: 100