回归新的目的?

时间:2013-04-03 17:41:13

标签: java return

public Double squareRoot(Double d)
{
return new Double (Math.sqrt(d.doubleValue()));
}

“归还新”的目的是什么?如果删除“新”,它仍然可以工作吗?

4 个答案:

答案 0 :(得分:9)

是的,实际上您可以删除更多代码:

public Double squareRoot(Double d)
{
    return Math.sqrt(d);
}

即使Math.sqrt返回double而不是Double。这是通过名为Autoboxing的java功能完成的。

但正如@assylias指出的那样,你问是否可以删除new关键字。答案是否定的。这不编译:

public Double squareRoot(Double d)
{
    return Double (Math.sqrt(d.doubleValue()));
}

错误是“预期的方法调用”。您不能将类的构造函数称为方法。您只能通过在其前面放置new关键字来调用构造函数。

答案 1 :(得分:2)

您没有使用名为'return new'的内容,而是使用以下代码:

return new Double (Math.sqrt(d.doubleValue()));

实际上

  1. new Double (Math.sqrt(d.doubleValue()))(创建一个值为Math.sqrt(d.doubleValue())
  2. 的新Double对象
  3. return第1步的值
  4. Java还有一个名为autoboxing的概念,它允许在Double类型的对象和类型double的值之间自动转换。因此,您无需使用new Double(...)显式创建对象,因为Math.sqrt(...)返回值double。 Java将为您自动执行此操作。同样适用于参数d:您无需在其上调用doubleValue()

    因此您可以将代码更改为:

    public Double squareRoot(Double d) {
       return Math.sqrt(d);
    }
    

    或者更好地使用原始double作为Double类型的对象在这里不是必需的:

    public double squareRoot(double d) {
       return Math.sqrt(d);
    }
    

    或者更好(正如 forivall 在评论中指出另一个答案)不要打扰这个方法,只需直接调用Math.sqrt(...)

答案 2 :(得分:1)

new Double (Math.sqrt(d.doubleValue()));涉及将基本类型double转换为其包装类Double,反之亦然。但这是不必要的。相反,您可以执行return Math.sqrt(d),这是自动装箱和拆箱的示例。

“Autoboxing是Java编译器在基元类型和相应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换为换句话说,这称为拆箱。“

  

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

答案 3 :(得分:0)

是的,只要您使用的是Java 5或更高版本,它仍可以使用(前提是您还删除Math.sqrt(d)周围的括号)。该功能称为自动装箱/自动拆箱,这意味着JVM会自动将原语包装在相应的包装类型中。

然而,写return new Double(Math.sqrt(d))的缺点是效率稍差。如果您使用return Double.valueOf(Math.sqrt(d))(或只是return Math.sqrt(d);,则第一个选项将创建一个新的Double对象,而后两个选项将尝试重新使用之前创建的Double实例。

有关详细信息,请参阅Double.valueOf() Javadoc。