以下几种情况,会让一个方法返回到调用它的代码
1. 完成方法中的所有语句
2. 达到return语句
3. 抛出异常(稍后覆盖)
以第一个为例。 在方法声明中声明方法的返回类型。在方法的正文内,你使用return语句来返回值。 声明为void的任何方法都不返回值。它不需要包含return语句,但它可以这样做。在这种情况下,return语句可以用于分支出控制流块并退出该方法,并且简单地使用如下:
return;
如果您尝试从声明为void的方法返回值,则会收到编译器错误。
任何未声明为void的方法都必须包含具有相应返回值的return语句,如下所示:
return returnValue;
返回值的数据类型必须与方法声明的返回类型相匹配;您不能从声明为返回布尔值的方法返回整数值。 Rectangle Rectangle类中的getArea()方法在对象部分中讨论时返回一个整数:
// a method for computing the area of the rectangle
public int getArea() {
return width * height;
}
此方法返回表达式width * height计算的整数。
getArea方法返回一个原始类型。一种方法也可以返回一个引用类型。例如,在一个程序来操纵Bicycle 对象,我们可能会有一个这样的方法:
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是java.lang.Number的子类,它又是Object的一个子类,如下图所示。
现在假设你有一个方法声明返回一个数字:
public Number returnANumber() {
...
}
returnANumber方法可以返回一个ImaginaryNumber而不是一个Object。 ImaginaryNumber是一个数字,因为它是Number的子类。但是,对象不一定是数字 - 它可以是字符串或另一种类型。 您可以覆盖一个方法并定义它以返回原始方法的子类,如下所示:
public ImaginaryNumber returnANumber() {
...
}
这种称为协变返回类型的技术意味着允许返回类型与子类方向相同。
注意:您也可以使用界面名作为返回类型。在这种情况下,返回的对象必须实现指定的接口。