方法重写的一大两小两同

来源:互联网 发布:linux 进入mysql 编辑:程序博客网 时间:2024/04/30 13:32

很多朋友对重写有点误解,认为重写是访问修饰符比被重写的方法大,而返回值类型必须一致,方法签名一样;

其实并不是这样的。

首先,我们先说说,重写的前提?

在子父类中(也可以在接口和实现类中),子类(实现类) 重写父类的方法。

那,什么是重写呢?

当子类跟父类拥有相同的功能,但是实现方式不同时,子类重写父类的方法即可,

举例:动物类拥有eat()方法,猫类是动物类的子类,猫也有吃的方法 ,猫拥有吃的功能跟动物拥有吃的功能是一样的,所以没必要写一个eat2之类的

直接重写父类的eat方法即可;

那么,为什么要重写呢?

1.父类已经有这个功能的方法了,子类假如有相同功能的方法,使用重写的方式更加便利,不会造成子类既继承得到了父类的这个功能,又自己拥有一个同样的功能而方法名却不一样的尴尬境地

2.继承是多态的前提,重写方法也是为了多态的扩展性的。

最后,如何 重写父类的方法呢?

重写方法得满足一大两小两同,所谓的一大两小两同是:

一大:访问修饰符比(被重写的)父类的大(或一样)

两小:返回值类型、声明异常 比(被重写的)父类的小(或一样)

两同:方法名和参数列表(方法签名)必须相同

访问修饰符的大小,从小到大为:private<默认的<protected<public,也就是假如父类的方法是默认的修饰,那么子类重写的只能是默认的或protected或public,不能是private

而这里 返回值类型 的大小指的是  父子类的大小,父类比子类大,什么意思?

class A{}

class B extends A{}

B是A的子类,A是Object的子类,   

如果其他的子父类(当然,你在A,B类中也行),再举例:

class Father{   public A method(){}   }

class Son extends Father{ //重写父类的方法   public  ? method() }

Son类中重写Father的方法,Father的返回值为A,那么Son类的返回值类型,只能是A或A的子类,不能是Object

也就是?只能是A  或 B,不能是Object

声明异常的小指的跟返回值类型的小是一样的,比如父类声明了 一个父类异常IOException  那么子类声明的异常只能是IOException或其子类,不能是IOException的父类;

并且子类的声明异常要被父类声明的异常包含,什么意思呢?比如父类声明了多个异常,子类只能声明父类声明的异常被包含的范围内,

比如,父类声明了A,B,C异常,子类只能最多声明A,B,C当然,子类只声明A也是可以的

但是这里有点小特殊的地方:比如父类声明了A异常,子类重写的方法声明多个A异常的子类,是可以的。(其实意思就是子类重写的方法声明的异常是父类声明的异常被包含的范围内)

最后,方法名和参数列表必须一致






原创粉丝点击