1. 程式人生 > >深入 -- 為什麼不能根據返回型別來區分過載?

深入 -- 為什麼不能根據返回型別來區分過載?

昨天上網亂翻,看到一個問題,挺有意思的。

過載(方法名相同、引數列表不同)這個概念,相信大家都知道了,很多面試都會問到。

但為什麼不能根據返回型別來區分過載?

首先過載是Java多型的一種體現,它實現的是編譯時的多型。

舉個例子:

float max(int a, int b);
int max(int a, int b);

上面兩個方法,別人呼叫的時候,不要返回值,直接就是:max(...),你能區分出它想呼叫哪個函式嗎?

當呼叫max(1, 2);時無法確定呼叫的是哪個,單從這一點上來說,僅返回值型別不同的過載是不應該允許的。

另外,在Java虛擬機器中也有提到過載的問題:

在《深入理解Java虛擬機器》中,6.3.6章節有這樣一段:

    在Java語言中,要過載一個方法,除了要與原方法具有相同的簡單名稱之外,還要求必須擁有一個與原方法不同的特徵簽名;

    特徵簽名就是一個方法中各個引數在常量池中的欄位符號引用的集合,也就是因為返回值不會包含在特徵簽名之中,因此Java語言裡面是無法僅僅依靠返回值的不同來對一個已有方法進行過載。

    但在Class檔案格式之中,特徵簽名的範圍更大一些,只要描述符不是完全一致的兩個方法也可以共存。

    也就是說,如果兩個方法有相同的名稱和特徵簽名,但返回值不同,那麼也是可以合法存於同一個Class檔案中的。

Class檔案中同方法名、同參數、不同返回值可以,那為什麼Java檔案中不行呢?

因為Java語言規範的規定,所以編譯時會出現錯誤。

那為什麼Class檔案可以呢?因為Java虛擬機器規範和Java語言規範不同,兩者是分開的...

如有更多興趣,可以看看這篇文章

奈何水平有限,再挖就挖不動了.....