本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK发行说明。
当一个方法返回到调用它的代码时,有以下三种情况:
return语句以先出现的情况为准。
你在方法声明中声明方法的返回类型。在方法的主体中,你使用return语句返回值。
任何声明为void的方法都不返回值。它不需要包含return语句,但也可以包含。在这种情况下,return语句可以用于跳出控制流块并退出方法,使用方法如下:
return;
如果你试图从一个声明为void的方法返回一个值,你会得到一个编译器错误。
任何未声明为void的方法都必须包含一个带有相应返回值的return语句,如下所示:
return returnValue;
返回值的数据类型必须与方法声明的返回类型相匹配;你不能从一个声明为返回布尔值的方法中返回一个整数值。
在关于对象的部分中讨论的Rectangle类中的getArea()方法返回一个整数:
// 计算矩形的面积的方法
public int getArea() {
return width * height;
}
这个方法返回表达式width*height求值的整数。
getArea方法返回一个基本类型。方法也可以返回一个引用类型。例如,在一个操作Bicycle对象的程序中,我们可能有一个像这样的方法:
public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike,
Environment env) {
Bicycle fastest;
// 根据每辆自行车的齿轮和踏频以及环境(地形和风)来计算哪辆自行车更快的代码
return fastest;
}
如果这一部分让你困惑,可以跳过它,在完成关于接口和继承的课程后再回来看。
当一个方法将类名用作返回类型时,如whosFastest方法所示,返回对象的类型的类必须是返回类型的子类或完全相同的类。假设你有一个类层次结构,其中ImaginaryNumber是java.lang.Number的子类,而java.lang.Number又是Object的子类,如下图所示:
ImaginaryNumber的类层次结构
现在假设你有一个声明返回Number的方法:
public Number returnANumber() {
...
}
returnANumber方法可以返回ImaginaryNumber,但不能返回Object。 ImaginaryNumber是Number的子类,因此它也是一个Number。然而,Object不一定是一个Number — 它可以是一个String或其他类型。
你可以重写一个方法并将其定义为返回原始方法的子类,例如:
public ImaginaryNumber returnANumber() {
...
}
这种技术被称为协变返回类型,意味着返回类型允许与子类相同的方向变化。