java中重载和重写的用法小结.doc_第1页
java中重载和重写的用法小结.doc_第2页
java中重载和重写的用法小结.doc_第3页
java中重载和重写的用法小结.doc_第4页
java中重载和重写的用法小结.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重载(overload): 1、必须具有不同的参数列表; 2、可以有不同的返回类型,只要参数列表不同就可以了; 3、可以有不同的访问修饰符; 4、可以抛出不同的异常; 5. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法(编译器决定), 这就是多态性。重写(overwrite)(方法覆盖): 1. 子类方法的名称,参数签名和返回类型必须与父类方法的名称,参数签名和返回类型一致。 2. 访问修饰符的限制一定要大于被重写方法的访问修饰符,即子类方法不能缩小父类方法的访问权限。 (publicprotecteddefaultprivate)eg1.子类的 method() 方法是私用的,父类的 method()方法是公共的,子类缩小了 父类方法的访问权限,这是无效的方法覆盖,将导致编译错误。 The reason:为什么子类方法不允许缩小父类方法的访问权限呢?这时因为假如没有这个限制,将于Java 语言的多态机制发生冲突。eg2. Base base = new Sub() ;/base 变量被定义为Base 类型,但引用 Sub 的实例。 base.method(); Java 编译器认为以上是合法的代码,但是在运行时,根据动态绑定规则,Java 虚拟机会调用base 变量所引用的Sub 实例的 method()方法,如果这个方法为 private 类型,Java 虚拟机就没有办法访问它.所以为了避免这样的矛盾,Java 语言不允许子类方法缩小父类中被覆盖方法的权限。 3. 子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类抛出的异常类的子类。 eg1.父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出 Exception,只能抛出IOException的子类异常,可以抛出非检查异常。 eg2.假设异常类ExceptionSub1 和 ExceptionSub2 是 ExceptionBase 类的子类 public class Base void method() throws ExceptionSub1 public class Sub1 extends Base void method() throws ExceptionBase /编译出错 public class Sub2 extends Base void method() throws ExceptionSub1,ExceptionSub2/编译出错 *The reason:为什么子类不允许抛出比父类方法更多的异常呢?这时因为假如没有这个限制,将会与Java 语言的多态机制发生冲突。 Base base = new Sub2() ;/base 变量被定义为Base 类型,引用Sub2 的实例。 try base.method(); catch(ExceptionSub1 e). /仅仅描述ExceptionSub1 异常 Java 编译器认为以上是合法的代码。但在运行时,根据动态绑定规则,Java虚拟机会调用 base 变量所引用的Sub2 实例的 method() 方法。 假如 Sub2 实例的 method() 方法抛出 ExceptionSub2 异常,由于该异常没有被捕获,将导致程序异常终止。 4.重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。 eg1.public class Father public void speak() System.out.println(Father); public class Son extends Father public void speak() System.out.println(son); /这也叫多态性。 父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。 父类方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。 父类方法一但被final时,无论该方法被public,protected及默认所修饰时,子类根本不能重写父类方法。eg2.public class Father final public void speak() System.out.println(Father); public class Son extends Father public void speak() System.out.println(son); /编译器会报错;多态性:多态性是面向对象编程的一种特性,和方法无关, 1.简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的 重载有不同的参数列表(静态多态性)2.而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法,即在子类中重写该方法相同参数,不同实现(动态多态性)动态绑定: 1. 编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base类的test注释掉,这时再编译就无法通过。 2. 重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1。 3. 若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪个方法。 4. 当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。在eg中,b所指向的实际类型是TestOverriding,所以b.test(0)调用子类的test。但是,子类并没有重写test(byte b),所以b.test(byte)0)调用的是父类的test(byte b)。如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为int,最终调用的是子类的test(int i)。eg. public class Base void test(int i) System.out.print(i); void test(byte b) System.out.print(b); public class TestOverriding extends Base void test(int i) i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论