方法返回到调用它的代码,当它
- 完成方法中的所有语句,
- 达到
return
语句,或 - 抛出异常(稍后介绍),
以先发生者为准。
您可以在方法的方法声明中,声明方法的返回类型。在方法的主体内,您可以使用return
语句返回值。
任何声明为void
的方法,均不返回值。它不需要包含return
语句,但可以包含return
语句。在这种情况下,可以使用一条return
语句,从控制流块中分支出来,并退出该方法,并且可以像这样简单地使用它:
return;
如果尝试从声明为void
的方法返回值,则会出现编译器错误。
任何未声明为void
的方法,都必须包含带有相应返回值的return
语句,如下所示:
return returnValue;
返回值的数据类型,必须与方法声明的返回类型相匹配;您不能从声明为返回布尔值的方法中,返回整型值。
关于对象的各节中,讨论了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;
}
返回类或接口
如果本节使您感到困惑,请在完成有关接口和继承的课程之后,跳过它并返回。
当方法使用类名作为其返回类型时,如whosFastest
,返回的对象类型的类,必须是该返回类型的子类,或该返回类型的确切类。假设您具有这样的一个类层次结构,其中ImaginaryNumber
是java.lang.Number
的子类,而java.lang.Number
又是Object
的子类, 如下图所示。
ImaginaryNumber的类层次结构
现在假设您有一个声明为返回Number
的方法:
public Number returnANumber() {
...
}
returnANumber
方法可以返回ImaginaryNumber
,但不能返回Object
。因为ImaginaryNumber
是Number
的子类。但是,Object
不一定是Number
,它可以是String
或其他类型。
您可以重写方法并定义它,以返回原方法的子类,如下所示:
public ImaginaryNumber returnANumber() {
...
}
这种称为协变返回类型(__covariant return type)的技术意味着,允许返回类型在与子类相同的方向上变化。
注意: 您也可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。