欢迎来到天天文库
浏览记录
ID:8803233
大小:38.00 KB
页数:5页
时间:2018-04-08
《java中重载和重写的用法小结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、重载(overload):1、必须具有不同的参数列表;2、可以有不同的返回类型,只要参数列表不同就可以了;3、可以有不同的访问修饰符;4、可以抛出不同的异常;5.调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法(编译器决定),这就是多态性。重写(overwrite)(方法覆盖):1.子类方法的名称,参数签名和返回类型必须与父类方法的名称,参数签名和返回类型一致。2.访问修饰符的限制一定要大于被重写方法的访问修饰符,即子类方法不能缩小父类方法的访问权限。(public>protected>default>priv
2、ate)eg1.子类的method()方法是私用的,父类的method()方法是公共的,子类缩小了父类方法的访问权限,这是无效的方法覆盖,将导致编译错误。Thereason:为什么子类方法不允许缩小父类方法的访问权限呢?这时因为假如没有这个限制,将于Java语言的多态机制发生冲突。eg2.Basebase=newSub();//base变量被定义为Base类型,但引用Sub的实例。base.method();Java编译器认为以上是合法的代码,但是在运行时,根据动态绑定规则,Java虚拟机会调用base变量所引用的Sub实例的met
3、hod()方法,如果这个方法为private类型,Java虚拟机就没有办法访问它.所以为了避免这样的矛盾,Java语言不允许子类方法缩小父类中被覆盖方法的权限。3.子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类抛出的异常类的子类。eg1.父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。eg2.假设异常类ExceptionSub1和ExceptionS
4、ub2是ExceptionBase类的子类publicclassBase{voidmethod()throwsExceptionSub1{}}publicclassSub1extendsBase{voidmethod()throwsExceptionBase{}//编译出错}publicclassSub2extendsBase{voidmethod()throwsExceptionSub1,ExceptionSub2{}//编译出错}*Thereason:为什么子类不允许抛出比父类方法更多的异常呢?这时因为假如没有这个限制,将会与J
5、ava语言的多态机制发生冲突。Basebase=newSub2();//base变量被定义为Base类型,引用Sub2的实例。try{base.method();}catch(ExceptionSub1e){……..}//仅仅描述ExceptionSub1异常Java编译器认为以上是合法的代码。但在运行时,根据动态绑定规则,Java虚拟机会调用base变量所引用的Sub2实例的method()方法。假如Sub2实例的method()方法抛出ExceptionSub2异常,由于该异常没有被捕获,将导致程序异常终止。4.重写方法只能存在
6、于具有继承关系中,重写方法只能重写父类非私有的方法。eg1.publicclassFather{publicvoidspeak(){System.out.println(Father);}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//这也叫多态性。①父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。②父类方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。③父类方法
7、一但被final时,无论该方法被public,protected及默认所修饰时,子类根本不能重写父类方法。eg2.publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//编译器会报错;多态性:多态性是面向对象编程的一种特性,和方法无关,1.简单说,就是同样的一个方法能够根据输入数据的不同,做出不同
8、的处理,即方法的重载——有不同的参数列表(静态多态性) 2.而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法,即在子类中重写该方法——相同参数,不同实现(动态多态性)动态绑定:1.编译器检查对
此文档下载收益归作者所有