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 (协变返回类型) 的技术意味着返回类型可以在与子类相同的方向上变化。