方法覆写是建立在继承的基础上的。也是一种动态的多态性(polymorphism)。
有例子代码总结一些细节:
package test;
import java.io.IOException;
//父类A
public class A {
public synchronized int fun(int a) throws IOException {
return a ;
}
}
import java.io.IOException;
/**
* 子类B继承类A
* 测试子类覆写父类的方法。
* @author java魔人
*
*/
public class B extends A {
//子类覆写父类的方法,所抛异常只能比父类少,或是其父类所抛异常的子类,否则编译出错
public int fun(int a)throws Exception{ //编译错误
return a;
}
//上面方法修改如下
public int fun(int a)throws IOException{ //编译错误
return a;
}
public static void main(String[] args) {
A a=new B();
try {
System.out.println(a.fun(1));
} catch (IOException e) {
e.printStackTrace();
}
}
}
说明:同步方法可以被子类覆写,而子类覆写的方法可以不同步,如上例;子类覆写父类的方法必须遵循以下几个规范:
1、方法名相同
2、参数列表完全匹配
3、返回值类型相同
注意点:
1、子类方法不能缩小父类方法的访问权限(可以扩大:protected----》public(这样不提倡,也不专业))
2、子类方法抛出的异常只能比父类方法少或者是父类方法所抛异常的子类。
3、父类中的非static方法不能被子类覆写成static方法。
4、父类中的同步(synchronized)方法可以被子类覆写成非同步方法。
附加:
子类覆盖父类方法时的异常声明
当子类覆盖(重写)父类的方法时,子类方法通常应有与父类方法相同的异常声明,子类方法亦可以声明比父类方法抛出更少和更具体的普通异常,但不能声明比父类方法抛出更多和更广泛的普通异常。即子类方法声明抛出的异常可以是其覆盖的父类方法所抛出的异常的子集,这包括两个方面:
(1)子类方法抛出的异常可以是其所覆盖的父类方法抛出异常的子类。
(2)如果父类方法抛出多个异常,子类方法可以抛出这些异常中的一部分,甚至不抛出异常。