方法返回到调用它的代码,当它

  • 完成方法中的所有语句,
  • 达到return语句,或
  • 抛出异常(稍后介绍),

以先发生者为准。
您可以在方法的方法声明中,声明方法的返回类型。在方法的主体内,您可以使用return语句返回值。
任何声明为void的方法,均不返回值。它不需要包含return语句,但可以包含return语句。在这种情况下,可以使用一条return语句,从控制流块中分支出来,并退出该方法,并且可以像这样简单地使用它:

  1. return;

如果尝试从声明为void的方法返回值,则会出现编译器错误。
任何未声明为void的方法,都必须包含带有相应返回值的return语句,如下所示:

  1. return returnValue;

返回值的数据类型,必须与方法声明的返回类型相匹配;您不能从声明为返回布尔值的方法中,返回整型值。
关于对象的各节中,讨论了Rectangle类中的getArea()方法返回一个整型:

  1. // a method for computing the area of the rectangle
  2. public int getArea() {
  3. return width * height;
  4. }

方法返回表达式width*height求值的整型。
getArea方法返回基本类型。方法也可以返回引用类型。例如,在一个用于操作Bicycle对象的程序中,我们可能有如下方法:

  1. public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike,
  2. Environment env) {
  3. Bicycle fastest;
  4. // code to calculate which bike is
  5. // faster, given each bike's gear
  6. // and cadence and given the
  7. // environment (terrain and wind)
  8. return fastest;
  9. }

返回类或接口

如果本节使您感到困惑,请在完成有关接口和继承的课程之后,跳过它并返回。
当方法使用类名作为其返回类型时,如whosFastest,返回的对象类型的类,必须是该返回类型的子类,或该返回类型的确切类。假设您具有这样的一个类层次结构,其中ImaginaryNumberjava.lang.Number的子类,而java.lang.Number又是Object的子类, 如下图所示。
从方法返回值 - 图1
ImaginaryNumber的类层次结构
现在假设您有一个声明为返回Number的方法:

  1. public Number returnANumber() {
  2. ...
  3. }

returnANumber方法可以返回ImaginaryNumber,但不能返回Object。因为ImaginaryNumberNumber的子类。但是,Object不一定是Number,它可以是String或其他类型。
您可以重写方法并定义它,以返回原方法的子类,如下所示:

  1. public ImaginaryNumber returnANumber() {
  2. ...
  3. }

这种称为协变返回类型(__covariant return type)的技术意味着,允许返回类型在与子类相同的方向上变化。


注意: 您也可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。