class A
{
void fun() throws Exception
{
}
};class B extends A
{
protected void fun()
{
}
};这样是可以的,为什么异常不用覆盖呢?
还有一点为什么这非要用void呢int fun()应该也是同一个函数吧,为什么不可以呢?
{
void fun() throws Exception
{
}
};class B extends A
{
protected void fun()
{
}
};这样是可以的,为什么异常不用覆盖呢?
还有一点为什么这非要用void呢int fun()应该也是同一个函数吧,为什么不可以呢?
异常可以变“窄”//这非要用void呢int fun()应该也是同一个函数吧,为什么不可以呢?
那如果就写一句 fun() 到底算是调用哪个? override需要函数一致,overload的话不能靠返回值
class A{
void f() throws AException, BException{
}
}class B extends A{
void f() throws AException{
}
}不知道你int, void到底想说什么
A.fun() throws Exception
提供了方法结束的2个途径, 要么正常返回,要么 抛出 Exception,现在 你覆盖的话,只要不超出这2个可能的范围就行了,同时 访问许可范围不小于 包内友好的 。
你不抛出异常或者可能抛出的异常 种类比上面的少,同时 访问许可范围不小于 包内友好的 就行了。如果 class A{
void fun() throws IOException , SQLException;
}比如:
protected void fun(); // 正确。不抛
public void fun() throws IOException; // 抛的种类比父类的个数少同时是父类方法抛的异常的子类或者子类。
void fun()throws FileNotFoundException; //可以, 父类方法抛的异常的子类,“不超出父类”。
// 错误。
private void fun(); // 错误,访问许可范围变小了。
protected void fun() throws Throwable ; // 错误, 异常类型 “超出了”父类方法的异常类型范围,不满足“等于或是子类”。
这就是上面所说的:
抛出的异常类型 可以 “窄”。
访问许可范围 可以 “宽”。