文档

Java™ 教程-Java Tutorials 中文版
从方法中返回一个值
Trail: Learning the Java Language
Lesson: Classes and Objects
Section: More on Classes

从方法中返回一个值

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

以先发生者为准。

你在方法声明中声明一个方法的返回类型。在方法的主体中,使用 return 语句返回值。

任何声明为 void 的方法都不会返回一个值。它不需要包含 return 语句,但也可以包含。在这种情况下,可以使用 return 语句从控制流程块分支退出并退出该方法,并简单地使用如下所示:

return;

如果你尝试从声明为 void 的方法返回一个值,你将收到编译器错误。

任何声明为非 void 的方法都必须包含具有相应返回值的 return 语句,如下所示:

return returnValue;

返回值的数据类型必须与方法的声明返回类型相匹配;你不能从声明返回布尔值的方法返回一个整数值。

Rectangle 类中的 getArea() 方法返回一个整数,Rectangle 类已经在前面的 objects 部分讨论过:

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

ImaginaryNumber 的类层次结构

ImaginaryNumber 的类层次结构

现在假设你有一个方法声明返回一个 Number

public Number returnANumber() {
    ...
}

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

你可以重写一个方法并将其定义为返回原始方法的子类,如下所示:

public ImaginaryNumber returnANumber() {
    ...
}

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


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

Previous page: More on Classes
Next page: Using the this Keyword