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

“返新”的目的是什么?如果“新”被删除,它仍然有效吗?

4

4 回答 4

9

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

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

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

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

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

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

于 2013-04-03T17:42:03.043 回答
2

您没有使用名为“return new”的东西,而是使用以下代码:

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

实际上确实

  1. new Double (Math.sqrt(d.doubleValue())) (创建一个新的 Double 对象,其值为Math.sqrt(d.doubleValue())
  2. return步骤 1 的值

Java 还有一个称为自动装箱的概念,它允许在类型对象和类型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(...)

于 2013-04-03T17:50:16.013 回答
1

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

“自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换相反,这叫做拆箱。”

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

于 2013-04-03T17:49:37.223 回答
0

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

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

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

于 2013-04-03T17:47:03.837 回答