从方法返回值
方法返回到调用该方法的代码
-
完成方法中的所有语句,
-
到达
return
语句,或 -
引发异常(稍后会发现),
以先发生者为准。
您可以在方法的方法声明中声明方法的返回类型。在方法的正文中,使用return
语句返回值。
任何声明为void
的方法都不会返回值。它不需要包含return
语句,但是可以包含。在这种情况下,可以使用return
语句从控制流块中分支出来并退出该方法,可以这样简单地使用它:
return;
如果try从声明为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;
}
返回类或interface
如果本节使您感到困惑,请在完成有关interface和继承的类后跳过它并返回。
当方法使用类名作为其返回类型时,例如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 *的技术意味着允许返回类型在与子类相同的方向上变化。
Note:
您也可以使用interface名称作为返回类型。在这种情况下,返回的对象必须实现指定的interface。