首页 理论教育 Java程序设计:方法和域的覆盖

Java程序设计:方法和域的覆盖

时间:2023-11-26 理论教育 版权反馈
【摘要】:为了体现子类的这种个性,Java允许子类对父类的同名方法重新进行定义,即子类可以定义与父类方法同名但其内容不同的方法。super表示的是当前对象的直接父类对象,它是当前对象的直接父类对象的引用。重载的方法属于同一个类,而覆盖的方法分别属于父与子的不同类。方法覆盖示例二。

Java程序设计:方法和域的覆盖

由于面向对象系统中的继承特性,子类可以继承父类中的方法。但是,子类的某些特征可能与从父类继承而来的特征有所不同。为了体现子类的这种个性,Java允许子类对父类的同名方法重新进行定义,即子类可以定义与父类方法同名但其内容不同的方法。这种多态就称为覆盖,或称为重写,还有的称为隐藏。由于覆盖的同名方法同时存在于子类和父类之中,所以在方法引用时需要指明引用的是父类的方法还是子类的方法。值得注意的是,在覆盖的同名方法中,子类方法不能比父类方法的访问权限更严格。例如,如果父类方法method()的访问权限是public,子类方法method()的权限就不能是private,否则会出现编译错误。在子类中,若要使用父类中被隐藏的方法,可以使用super关键字。super表示的是当前对象的直接父类对象,它是当前对象的直接父类对象的引用。例如,设类A派生出子类B,类B派生出自己的子类C,类B是类C的直接父类,而类A不是类C的直接父类。super仅代表当前类的直接父类。

【例4-13】利用例4-2中定义的平面二维点类Point,定义空间的三维点类Point3D。

在例4-13中,Point3D是Point的子类。使用的关键字super代表当前类Point3D的直接父类,即类Point。而关键词this代表当前类Point3D。

由于一些方法存在于不同的父、子类中,在调用方法时需要指明调用哪个类或对象的方法。其调用格式如下:

下面给出方法覆盖的示例。

【例4-14】方法覆盖示例一。

本程序调用子类的print()方法结束之前,还要再调用父类的print()方法。程序的执行结果如下:

注意,如果方法名相同,而参数表不同,这是方法的重载。调用重载方法时,编译器将根据参数的个数和类型,选择对应的方法执行。重载的方法属于同一个类,而覆盖的方法分别属于父与子的不同类。

下面考虑Employee和Manager类中的这些示例方法。

【例4-15】方法覆盖示例二。

由该例可以看出,Employee类中有一个getDetails()方法,而由Employee派生的Manager类中也有一个同名同参数同返回类型的getDetails()方法,因此,子类中的方法覆盖或称隐藏了父类的方法。

在前面的类定义之后,假定实例化如下两个对象:(www.xing528.com)

此时,e.getDetails()与m.getDetails()将执行不同的代码。前者是Employee对象,将执行Employee类中的方法,后者是Manager对象,执行的是Manager类中的方法。如果这样创建实例:

则e.getDetails()调用哪个方法就显得不清楚。实际上,此处遇到的是Java面向对象的一个重要特性。Java执行与对象真正类型(运行时类型)相关的方法,而不是与引用类型(编译时类型)相关的方法。这也是多态的另一个重要性质,常称为虚方法调用。因此,上例e.getDetails()将执行Manage类中的方法,因为实例的真正类型是Manager。

【例4-16】在前面定义的二维点类基础上,扩展成三维点类增加求该点到原点距离的方法。

运行结果如下:

方法覆盖与重载相类似,不同的方法都具有相同的名字。覆盖与重载的不同之处有:

●覆盖与被覆盖的同名方法分别属于不同的父、子类。而重载的同名方法属于同一类。

●覆盖与被覆盖的同名方法具有相同的参数列表和返回值类型。而重载的同名方法必须具有不同的参数列表。

●覆盖方法的访问域不能比被覆盖方法的访问域更窄。而重载方法对访问域没有这种限制。类的域即成员变量也可以覆盖。它们的声明是类似的,只是在不同的类中进行声明。

【例4-17】域覆盖示例。

运行结果如下:

从上述结果中可以清楚地看出,域b.n和方法b.G()究竟使用了父类和子类的哪一个域声明。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈