从方法返回值

方法返回到调用该方法的代码

  • 完成方法中的所有语句,

  • 到达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,返回的对象类型的类必须是该返回类型的子类或确切的类。假设您具有一个类层次结构,其中ImaginaryNumberjava.lang.Number的子类,而继而又是Object的子类,如下图所示。

ImaginaryNumber 的类层次结构

ImaginaryNumber 的类层次结构

现在假设您有一个声明为返回Number的方法:

public Number returnANumber() {
    ...
}

returnANumber方法可以返回ImaginaryNumber但不能返回ObjectImaginaryNumberNumber,因为它是Number的子类。但是,Object不一定是Number,它可以是String或其他类型。

您可以重写方法并定义它以返回原始方法的子类,如下所示:

public ImaginaryNumber returnANumber() {
    ...
}

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

Note:

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