方法返回到调用它的代码,当它
- 完成方法中的所有语句,
- 达到
return语句,或 - 抛出异常(稍后介绍),
以先发生者为准。
您可以在方法的方法声明中,声明方法的返回类型。在方法的主体内,您可以使用return语句返回值。
任何声明为void的方法,均不返回值。它不需要包含return语句,但可以包含return语句。在这种情况下,可以使用一条return语句,从控制流块中分支出来,并退出该方法,并且可以像这样简单地使用它:
return;
如果尝试从声明为void的方法返回值,则会出现编译器错误。
任何未声明为void的方法,都必须包含带有相应返回值的return语句,如下所示:
return returnValue;
返回值的数据类型,必须与方法声明的返回类型相匹配;您不能从声明为返回布尔值的方法中,返回整型值。
关于对象的各节中,讨论了Rectangle类中的getArea()方法返回一个整型:
// a method for computing the area of the rectanglepublic 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)的技术意味着,允许返回类型在与子类相同的方向上变化。
注意: 您也可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。
