原文出自 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() { ... }
這種技術稱為協變返回類型,返回類型允許是多個子類,但是是同一分支。
注意:你也可以使用接口作為返回類型,這個情況下,返回的對象必須實現了這個接口。