java⽅法重写规则_Java中重写的规则
⼦类不能重写⽗类的静态⽅法,私有⽅法。即使你看到⼦类中存在貌似是重写的⽗类的静态⽅法或者私有⽅法,编译是没有问题的,但那其实是你重新⼜定义的⽅法,不是重写。具体有关重写⽗类⽅法的规则如下:
重写规则之⼀:
重写⽅法不能⽐被重写⽅法限制有更严格的访问级别。
但是可以更⼴泛,⽐如⽗类⽅法是包访问权限,⼦类的重写⽅法是public访问权限。有个⼈曾经这样说:⽗类为protected的,⼦类重写时⼀定要⽤public;我觉得这个观点不能是绝对的,只要满⾜⼦类的访问权限不⽐⽗类低就⾏了。
⽐如:Object类有个toString()⽅法,开始重写这个⽅法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的⽅法具有包访问权限,包访问权限⽐public当然要严格了,所以编译器会报错的。
重写规则之⼆:
参数列表必须与被重写⽅法的相同。
java重写和重载的区别重写有个孪⽣的弟弟叫重载,也就是后⾯要出场的。如果⼦类⽅法的参数与⽗类对应的⽅法不同,那么就是你认错⼈了,那是重载,不是重写。
重写规则之三:
返回类型必须与被重写⽅法的返回类型相同。
⽗类⽅法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;
}
}
总结:
在Java中静态⽅法可以被继承,但是不能被覆盖,即不能重写。
如果⼦类中也含有⼀个返回类型、⽅法名、参数列表均与之相同的静态⽅法,那么该⼦类实际上只是将⽗类中的该同名⽅法进⾏了隐藏,⽽⾮重写。
⽗类引⽤指向⼦类对象时,只会调⽤⽗类的静态⽅法。所以,它们的⾏为也并不具有多态性。
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。