2016-05-09 37 views
-1
public class A { 
     public float foo(float a, float b) throws IOException { 
    } 
} 
    public class B extends A { 
      ...... 
    } 

哪些功能可以放在B類中,爲什麼?過載和覆蓋引發異常

  1. 浮子FOO(浮起,浮子B){...}
  2. 公衆詮釋FOO(INT A,INT B)拋出異常{...}
  3. 公共浮FOO(浮一,浮動b)拋出異常{...}
  4. 公衆持股富(浮動p,浮q){...}

我認爲:1,錯了,不下手公開2.正確,超載3.錯誤,結束騎行不能拋出更廣泛的異常4.錯誤,重寫不能拋出更廣泛的異常

+0

你究竟問什麼?順便說一句,choice * 2 *也是錯誤的,因爲你不能通過改變它的返回類型來重載一個函數。 – Lefteris008

+1

@ PiXel1225:只能通過更改返回類型來重載方法。儘管如此,您也可以更改返回類型和參數類型。 –

+0

@ PiXel1225:2是正確的,看輸入類型 – avivk

回答

0

控制覆蓋允許或不允許的一般原則是你不能破壞Java使用子類實例的能力在聲明的類型是超類型的上下文中。

float foo(float a, float b){...} 

不正確的,因爲你不能減少子類中的方法的可見性。 (如果允許,會在運行時發生什麼,如果有人叫fooa聲明A a = new B();?)

public int foo (int a, int b) throws Exception {...} 

正確的。

如果這是一個覆蓋,它將是不正確的,因爲你不能使用不兼容的返回類型。 (您可以改變返回類型,但在覆蓋的返回類型必須是重寫返回類型的子類型)

然而,由於參數類型是不同的,這是一個過載,而不是覆蓋......這是正確的!

public float foo (float a, float) throws Exception {...} 

錯誤,因爲您不能拋出更廣泛(檢查)的異常。您可以更改的例外,但它們必須是子類中的子類型例外。 (該點是子類方法不能被允許拋出checked異常的超類方法的簽名說不能扔。)

public float foo(float p, float q) {...} 

正確的。重寫方法可以省略在重寫的方法中拋出的拋出的異常聲明。 (如果子類方法不能拋出並且超類方法可以拋出異常,它不會中斷檢查的異常規則。)

+0

非常感謝你! – avivk

+0

關於「float foo(float a,float b){...}」,您爲什麼說可見性降低了?是不是默認公開(如果沒有寫入?)? – avivk

+0

不可以。默認可見性是「封裝私有」,比「公共」更具限制性。 –