# 从方法返回值

> 原文： [https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html](https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html)

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

*   完成方法中的所有语句，
*   达到`return`声明，或
*   抛出异常（稍后介绍），

以先发生者为准。

您在方法声明中声明方法的返回类型。在方法体内，使用`return`语句返回值。

声明为`void`的任何方法都不返回值。它不需要包含`return`语句，但它可以这样做。在这种情况下，`return`语句可以用于分支出控制流程块并退出方法，并且只是像这样使用：

```
return;

```

如果您尝试从声明为`void`的方法返回值，则会出现编译器错误。

任何未声明的方法`void`必须包含带有相应返回值的`return`语句，如下所示：

```
return returnValue;

```

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

`Rectangle` [`Rectangle`](examples/Rectangle.java) 类中的`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;
}

```

## 返回类或接口

如果此部分让您感到困惑，请跳过它并在完成接口和继承课程后返回该部分。

当方法使用类名作为其返回类型时，例如`whosFastest`，返回对象类型的类必须是返回类型的子类或确切类。假设您有一个类层次结构，其中`ImaginaryNumber`是`java.lang.Number`的子类，而`java.lang.Number`又是`Object`的子类，如中图所示。

<center>![The class hierarchy for ImaginaryNumber](img/49bca86334db63fe98889c652cc8885e.jpg)

ImaginaryNumber 的类层次结构

</center>

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

```
public Number returnANumber() {
    ...
}

```

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

您可以覆盖方法并定义它以返回原始方法的子类，如下所示：

```
public ImaginaryNumber returnANumber() {
    ...
}

```

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

* * *

**Note:** You also can use interface names as return types. In this case, the object returned must implement the specified interface.

* * *