本教程是针对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() { ... }
这种技术被称为协变返回类型,意味着返回类型允许与子类相同的方向变化。