文档

Java™ 教程
隐藏目录
从方法返回值
路径: 学习Java语言
课程: 类和对象
章节: 关于类的更多内容

从方法返回值

当一个方法返回到调用它的代码时,有以下三种情况:

以先出现的情况为准。

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

任何声明为void的方法都不返回值。它不需要包含return语句,但也可以包含。在这种情况下,return语句可以用于跳出控制流块并退出方法,使用方法如下:

return;

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

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

return returnValue;

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

在关于对象的部分中讨论的Rectangle类中的getArea()方法返回一个整数:

    // 计算矩形的面积的方法
    public int getArea() {
        return width * height;
    }

这个方法返回表达式width*height求值的整数。

getArea方法返回一个基本类型。方法也可以返回一个引用类型。例如,在一个操作Bicycle对象的程序中,我们可能有一个像这样的方法:

public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike,
                              Environment env) {
    Bicycle fastest;
    // 根据每辆自行车的齿轮和踏频以及环境(地形和风)来计算哪辆自行车更快的代码
    return fastest;
}

返回一个类或接口

如果这一部分让你困惑,可以跳过它,在完成关于接口和继承的课程后再回来看。

当一个方法将类名用作返回类型时,如whosFastest方法所示,返回对象的类型的类必须是返回类型的子类或完全相同的类。假设你有一个类层次结构,其中ImaginaryNumberjava.lang.Number的子类,而java.lang.Number又是Object的子类,如下图所示:

ImaginaryNumber的类层次结构

ImaginaryNumber的类层次结构

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

public Number returnANumber() {
    ...
}

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

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

public ImaginaryNumber returnANumber() {
    ...
}

这种技术被称为协变返回类型,意味着返回类型允许与子类相同的方向变化。


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

上一页: 关于类的更多内容
下一页: 使用this关键字