java中重写和隐藏的区别(Java重载重写覆盖)
重载Overloading
发生要素如下:
1. 在同一作用范围内(同一个类,同一个接口)
2. 方法名必定相同
3. 形参组成不同(类型、个数均不相同 or 个数相同但类型不同 or 类型相同个数不同)
错误的认识:
1. 方法名相同,形参组成完全相同,返回类型不同也算重载(方法重载要求方法具有不同的签名:形参组成,而返回值并不算作签名内容,故不参与重载的选择)
2. abstract修饰必须存在才算重载方法(无所谓啊,修饰符惹谁了?)
覆盖/重写/覆写(一个意思!)(Overriding/Overwrite)
发生要素如下:
1. 不同作用范围内(继承别的类,实现接口)
2. 方法名相同(废话!)
3. 形参组成相同(类型、个数均相同)
4. 返回类型相同
个人理解:
1. 既然是覆盖,要完全盖住,学的像点,所以方法的外表要看上去一样嘛。
2. 实现接口方法,也可称为覆盖,毕竟是把空的方法体覆盖为具体的代码了。想想也是,实现接口的时候IDE是不是为我们自动加上了@Override注解?这个在JDK6之前的版本可不行,写这个注解是会报错的。
要注意的地方:派生方法不能抛出比基类方法范围更广的异常(速记:孩子不能闯比父母更大的祸),
错误范例:基类方法throws IOException,派生方法却throws Exception。
派生方法不能有比基类方法更大的访问度(速记:孩子不能比父母更能显摆),
错误范例:基类方法是protected,派生方法却是pub
隐藏Hiding
发生要素如下:
1. 同覆盖的1.2.3.4条件(必要)
2. 仅发生在静态方法上
要点:
隐藏不需要@Override注解修饰,加上会报错。且派生方法的可抛出异常范围和可访问范围的约束与覆盖相同(不能抛更多异常,不能有更广的访问权限)。
在jls11文档中,隐藏注明为 by Class Methods,而覆盖则是by Instance Methods,这个很好理解,静态的成员方法就是属于这个类的,隐藏也可以叫类的方法的覆盖。
个人理解:静态方法是和类绑定到一起的,那么在实例化的时候,用的谁的类型的引用,那么call到的方法就是谁的实现,也许说的不恰当,请看下例:
由于s的类型是Super,所以greeting()执行的是Super的实现,但是name()是正常的覆盖,好比派生类没有重写greeting()一样(派生类干的事儿被藏起来了)。但是s2 call到的就是Sub的实现了,符合常规的思路。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com