5.2.2 变量的隐藏
在一个子类继承直接超类(或父类)时,如果直接超类的某个成员变量对于子类而言是不合适的,那该怎么办呢?我们可以在子类中定义一个同名变量,进行变量隐藏。
在子类中定义了一个成员变量,它与直接超类中的某个成员变量同名,从而使直接超类中的那个成员不能被子类直接引用,这称为成员变量的隐藏。
注意:只要子类和直接超类中出现同名变量,而不管它们是否都为实例变量或者类变量,也不管它们的类型是否相同,都称为变量的隐藏。
【例5-3】 在例5-1中,在圆类和直接超类圆柱体类中增加同名变量,实现变量的隐藏。
程序运行结果:
分析与思考:(1)Circle类定义一个name变量,其直接子类也定义一个同名name变量。这样,在子类中,父类的name变量不能被引用,被隐藏起来了。
(2)当出现变量隐藏时,如果要在子类中直接引用直接超类中被隐藏的变量,可以使用包含关键字super的方法访问表达式,即:
super.变量名
例如在本例的Cylinder子类中使用super.name来引用父类的name变量。
(3)父类的私有变量radius不能被子类继承下来。这样,在子类类型Cylinder的成员变量只有height(子类自己定义的变量)和name(子类自己定义的并隐藏了父类的name变量)。
(4)在一个引用类型的成员方法中只能直接引用该类型具有的成员变量和成员方法。在父类类型Circle的成员方法中只能直接引用radius和name成员变量。在子类类型Cylinder的成员方法中只能直接引用height(子类自己定义的变量)和name(子类自己定义的并隐藏了父类的name变量)成员变量。然而,不能被继承的父类私有成员,可在子类中被间接引用。例如,在子类类型Cylinder的成员方法getArea()中,由于它是从父类继承下来的方法,所以,方法中引用的radius是父类的私有成员变量。进而,在子类的成员方法getVolume()中,通过getArea()方法间接引用父类的私有成员变量radius,计算出圆柱体的体积。
(5)一个引用类型的引用变量只能引用该类型具有的成员变量和成员方法。引用变量obj的类型是Cylinder子类类型,所以,obj.name只能引用子类Cylinder的name,即“cylinder”。若将obj的类型转换为Circle父类类型,即(Circle)obj,那么,((Circle)obj).name就是引用父类Circle的name,即“circle”。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。