Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
方法返回到调用它的代码当它
return 语句或以先发生者为准。
你在方法声明中声明一个方法的返回类型。在方法的主体中,使用 return 语句返回值。
任何声明为 void 的方法都不会返回一个值。它不需要包含 return 语句,但也可以包含。在这种情况下,可以使用 return 语句从控制流程块分支退出并退出该方法,并简单地使用如下所示:
return;
如果你尝试从声明为 void 的方法返回一个值,你将收到编译器错误。
任何声明为非 void 的方法都必须包含具有相应返回值的 return 语句,如下所示:
return returnValue;
返回值的数据类型必须与方法的声明返回类型相匹配;你不能从声明返回布尔值的方法返回一个整数值。
在 Rectangle 类中的 getArea() 方法返回一个整数,Rectangle 类已经在前面的 objects 部分讨论过:
// 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 的子类,如 下图。

ImaginaryNumber 的类层次结构
现在假设你有一个方法声明返回一个 Number:
public Number returnANumber() {
...
}
returnANumber 方法可以返回 ImaginaryNumber,但不能返回 Object。ImaginaryNumber 是 Number,因为它是 Number 的子类。但是,Object 不一定是 Number 它可能是一个 String 或其他类型。
你可以重写一个方法并将其定义为返回原始方法的子类,如下所示:
public ImaginaryNumber returnANumber() {
...
}
这种称为 covariant return type (协变返回类型) 的技术意味着返回类型可以在与子类相同的方向上变化。