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

2.2.3 成员的覆盖

如果有一个名为B的子类和一个名为A的父类,它们出现了相同的成员时,在子类B中直接访问该成员会得到什么结果?例如,考虑下面的程序。

【例2-6】 在子类中定义了与父类同名的成员,从而隐藏了父类同名成员。

            // 父类A
            class A {
                int x = 100;
                public void display() {
                    System.out.println("执行父类A的display()方法");
                    System.out.println("SuperClass A: " + x);
                }
            }
            // 子类B,继承于父类A
            class B extends A {
                int x=200;// 在子类B中父类A的同名变量x被隐藏
                public void display(){                // 方法的重写
                    System.out.println("执行子类B的display()方法");
                    System.out.println("SubClass B:"+x);  // 直接输出为子类变量x
                }
                public static void main(String[] args) {
                    B b = new B();
                    b.display();
                }
            }

该程序的运行结果如下:

            执行子类B的display()方法
            SubClass B: 200

从本示例程序中发现,在子类B中直接访问和父类同名成员时,只能访问到B中的同名成员。像这种子类(派生类)新增的成员名称与父类(超类)成员相同,则称为成员覆盖。成员覆盖包括成员变量的隐藏和成员方法的重写。

1.成员变量的隐藏

在类的继承中,若在子类中定义了与父类同名的成员变量,则在子类中父类的同名成员变量被隐藏。父类的同名成员变量在子类对象中仍占据自己的存储空间,子类隐藏父类的同名成员变量只是使它不可见。在【例2-6】中,子类B就隐藏了父类A的同名成员变量x,故在B中我们直接访问x得到值200。

2.成员方法的重写

跟子类可以定义与父类同名的成员变量,从而实现对父类成员变量的隐藏的情况一样,子类也可以定义与父类同名的成员方法,实现对父类方法的覆盖(方法的重写)。子类成员方法对父类同名成员方法的覆盖将使得父类的方法在子类对象中不复存在。注意,重写的方法和父类中被重写的方法要具有相同的名字,相同的参数和相同的返回类型。如【例2-6】中,子类B就重写了父类A的同名方法display()。