原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/29/2795468.html
代碼調用方法時,它會在以下情況返回:
完成方法所有的語句
出現return語句
拋出一個異常
以最先出現的為準。
在方法聲明中,會聲明方法的傳回型別。方法體內,可以使用return語句傳回值。
任何聲明了void的方法,不需要傳回值,它非必須包含一個return語句,但是它也可以這麼做。這個情況下,return語句可以用來跳出控制流程的代碼塊,並退出方法,簡單使用如下:
return;
在一個聲明void的方法,返回一個值,編譯器會報錯。
不是聲明為void的方法,必須包含一個return語句,緊跟對應的傳回值,就像這樣:
return returnValue;
傳回值的資料類型必須匹配方法聲明的返回資料類型;不能在一個聲明傳回型別是整數的方法,返回一個boolean類型的值。
下面討論的Rectangle的getArea()
方法返回一個整數:
// a method for computing the area of the rectangle public int getArea() { return width * height; }
這個方法返回運算式width*height計算出來的整數。
getArea方法返回原生類型。方法也可以放回參考型別。例如,在程式中操縱Bicycle
objects,我們也許會這麼做:
public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike, Environment env) { Bicycle fastest; // code to calculate which bike is // faster, given each bike's gear // and cadence and given the // environment (terrain and wind) return fastest;}
返回類或介面
如果本節混淆,跳過它,等到你已經完成了介面和繼承的學習再回頭看這個。
當一個方法是用類名作為傳回型別,例如whosFastest的做法,返回的對象的類的類型,必須是聲明的傳回型別的子類,或者就是聲明的傳回型別。假設有這麼一個類階層,ImaginaryNumber是Number的子類,Number是Object的子類,如所示:
ImaginaryNumber類階層
假如有這麼一個方法返回Number:
public Number returnANumber() { ...}
returnANumber方法可以返回ImaginaryNumber,但是不能返回一個Object。ImaginaryNumber是一個Number類,因為它是Number的子類。儘管如此,一個Object類未必是Number—它可以是一個String或者是其他類型。
public ImaginaryNumber returnANumber() { ...}
這種技術稱為協變傳回型別,傳回型別允許是多個子類,但是是同一分支。
注意:你也可以使用介面作為傳回型別,這個情況下,返回的對象必須實現了這個介面。