class A
{
void fun() throws Exception
{
}
};class B extends A
{
protected void fun()
{
}

};这样是可以的,为什么异常不用覆盖呢?
还有一点为什么这非要用void呢int fun()应该也是同一个函数吧,为什么不可以呢?

解决方案 »

  1.   

    //为什么异常不用覆盖呢
    异常可以变“窄”//这非要用void呢int fun()应该也是同一个函数吧,为什么不可以呢?
    那如果就写一句 fun() 到底算是调用哪个?  override需要函数一致,overload的话不能靠返回值
      

  2.   

    那如果就写一句 fun() 到底算是调用哪个?  override需要函数一致,overload的话不能靠返回值int fun()和void fun()是同一个函数啊,如果在同一个类中定义会提示函数以定义!
      

  3.   

    变“窄”就是这个意思
    class A{
      void f() throws AException, BException{  
      }
    }class B extends A{
      void f() throws AException{  
      }
    }不知道你int, void到底想说什么
      

  4.   

    我的意思是int,void是同一个函数,覆盖不就是同一个函数进行覆盖吗?而这样为什么不行呢?
      

  5.   

    void fun()他后面是不是隐藏了一个运行时异常?
      

  6.   

    当然是调用了 后面的那个,比如上面 
    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 ; // 错误, 异常类型 “超出了”父类方法的异常类型范围,不满足“等于或是子类”。
    这就是上面所说的:
    抛出的异常类型 可以 “窄”。
    访问许可范围   可以 “宽”。