- 1、本文档共124页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 Java语言的深入理解 方法覆盖 方法覆盖的概念 在面向对象语言程序设计中,覆盖(Override)的概念是经常用到的,通过方法的覆盖,可以达到语言多态性的目的。 方法覆盖的概念 覆盖一个方法的真正目的是要在某些方面进行扩展,或者加以改进。即在新方法中仍然保留原有的操作,而在新的方法中仍需使用已经被覆盖的方法中的代码。在Java中,这样的功能需要通过关键字super来实现。 程序11-1: 目标:说明super 的使用方法。 class SuperClass{ void showMyPosition(){ System.out.println(I am in superclass!); System.out.println(I will go back now ...); }} class SubClass extends SuperClass{ void showMyPosition(){ System.out.println (At first I will go to superclass ...); super.showMyPosition(); System.out.println (Now I have moved to subclass!);}} public class SuperTest{ public static void main(String args[]){ SubClass son=new SubClass(); son.showMyPosition(); } } 方法覆盖的概念 注意: 如果super.method()已经指向其父类中的某个方法,那么这个调用形式就会执行父类方法中的所有操作,而其中就也有可能包括一些原本不希望进行的操作。 方法覆盖的概念 super.method()语句所指向的这个方法不一定是在父类中加以描述的,它也可能是父类从它的祖先类中继承来的。因此,在有必要了解某方法的代码时有可能需要按继承关系依次向上查询才能够找到。 应用覆盖的规则 应用覆盖时的规则: (1) 覆盖方法的允许访问范围不能小于原方法。 (2) 覆盖方法所抛出的异常不能比原方法更多。 分析程序11-2: class SuperClass{ public void method(){ …… }} class SubClass extends SuperClass{ private void method(){ …… }} public class Test{ public static void main(String args[]){ SuperClass s1 = new SuperClass(); SuperClass s2 = new SubClass(); s1.method(); s2.method(); }} 分析程序11-2: 编译后会出现以下错误信息: Test.Java:6: Methods cant be overridden to be more private. Method void method() is public in class SuperClass. private void method(){ ^ 分析程序11-2: 由于子类SubClass中的方法method()是private类型,而在父类中它所覆盖的原方法是public类型,也就是要通过覆盖试图缩小该方法所能够被访问的范围,这是不允许的。根据运行时多态原理,对象s2所执行的方法method()是在Subclass中定义的method()版本,故它不能被访问。 程序11-3: //一个覆盖方法不能抛出更多的异常事件 import java.io.*; class Parent{ void method(){ } } class Child extends Parent{ void method() throws IOException{ } } 程序11-3: 编译后会出现以下错误信息: Child.Java:8: Invalid exception class Java.io.IOException in throws clause. The exception must be a subclass of an exception thrown by void method() from class Parent. void method() throws IOException{ ^ 程序11-3: 由于子类Child中method()方法抛出比其父类中原方
文档评论(0)