Java子类重写父类方法注意问题收集(转)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java⼦类重写⽗类⽅法注意问题收集(转)
⼦类不能重写⽗类的静态⽅法,私有⽅法。
即使你看到⼦类中存在貌似是重写的⽗类的静态⽅法或者私有⽅法,编译是没有问题的,但那其实是你重新⼜定义的⽅法,不是重写。
具体有关重写⽗类⽅法的规则如下:
重写规则之⼀:
重写⽅法不能⽐被重写⽅法限制有更严格的访问级别。
但是可以更⼴泛,⽐如⽗类⽅法是包访问权限,⼦类的重写⽅法是public访问权限。
有个⼈曾经这样说:⽗类为protected的,⼦类重写时⼀定要⽤public;我觉得这个观点不能是绝对的,只要满⾜⼦类的访问权限不⽐⽗类低就⾏了。
⽐如:Object类有个toString()⽅法,开始重写这个⽅法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。
出错的原因就是:没有加任何访问修饰符的⽅法具有包访问权限,包访问权限⽐public当然要严格了,所以编译器会报错的。
重写规则之⼆:
参数列表必须与被重写⽅法的相同。
重写有个孪⽣的弟弟叫重载,也就是后⾯要出场的。
如果⼦类⽅法的参数与⽗类对应的⽅法不同,那么就是你认错⼈了,那是重载,不是重写。
重写规则之三:
返回类型必须与被重写⽅法的返回类型相同。
⽗类⽅法A:void eat(){} ⼦类⽅法B:int eat(){}两者虽然参数相同,可是返回类型不同,所以不是重写。
⽗类⽅法A:int eat(){} ⼦类⽅法B:long eat(){}返回类型虽然兼容⽗类,但是不同就是不同,所以不是重写。
重写规则之四:
重写⽅法不能抛出新的异常或者⽐被重写⽅法声明的检查异常更⼴的检查异常。
但是可以抛出更少,更有限或者不抛出异常。
注意:这种限制只是针对检查异常,⾄于运⾏时异常RuntimeException及其⼦类不再这个限制之中。
重写规则之五:
不能重写被标识为final的⽅法。
重写规则之六:
如果⼀个⽅法不能被继承,则不能重写它。
如private⽅法
⽐较典型的就是⽗类的private⽅法。
下例会产⽣⼀个有趣的现象。
public class Test {
public static void main (String[] args) {
//Animal h = new Horse();
Horse h = new Horse();
h.eat();
}
}
class Animal {
private void eat(){
System.out.println ("Animal is eating.");
}
}
class Horse extends Animal{
public void eat(){
System.out.println ("Horse is eating.");
}
}
这段代码是能通过编译的。
表⾯上看来违反了第六条规则,但实际上那是⼀点巧合。
Animal类的eat()⽅法不能被继承,因此Horse类中的eat()⽅法是⼀个全新的⽅法,不是重写也不是重载,只是⼀个只属于Horse类的全新的⽅法!这点让很多⼈迷惑了,但是也不是那么难以理解。
main()⽅法如果是这样:
Animal h = new Horse();
//Horse h = new Horse();
h.eat();
编译器会报错,为什么呢?Horse类的eat()⽅法是public的啊!应该可以调⽤啊!请牢记,多态只看⽗类引⽤的⽅法,⽽不看⼦类对象的⽅法!
重写规则之七:
⼦类不能⽤静态⽅法重写⽗类的⾮静态⽅法
编绎⽆法通过this static method cannot hide the instance mehtodfrom
class A {
protected int method1(int a, int b) {
return 0;
}
}
public class Test1 extends A {
private int method1(int a, long b) {
return 0;
}
//this static method cannot hide the instance mehtod from A
static public int method1(int a, int b) {
return 0;
}
}
重写规则之⼋:
⼦类不能⽤⾮静态⽅法重写⽗类的静态⽅法
编绎报错:thisinstance method cannot override the static mehtod fromA
class A {
protected static int method1(int a, int b) {
return 0;
}
}
public class Test1 extends A {
private int method1(int a, long b) {
return 0;
}
//this static method cannot hide the instance mehtod from A
//this instance method cannot override the static mehtod from A
public int method1(int a, int b) {
return 0;
}
}
参考:
(以上内容转⾃此篇⽂章)。