Java 退货的目的是什么?
“还新”的目的是什么?如果删除了“new”,它还会工作吗?是的,事实上,您可以删除更多代码:Java 退货的目的是什么?,java,return,Java,Return,“还新”的目的是什么?如果删除了“new”,它还会工作吗?是的,事实上,您可以删除更多代码: public Double squareRoot(Double d) { return new Double (Math.sqrt(d.doubleValue())); } 即使Math.sqrt返回一个double,而不是double。这是由一个名为的java特性完成的 但是正如@assylias指出的,您询问是否可以删除new关键字。答案是否定的。这不会编译: public Double squa
public Double squareRoot(Double d)
{
return new Double (Math.sqrt(d.doubleValue()));
}
即使Math.sqrt
返回一个double
,而不是double
。这是由一个名为的java特性完成的
但是正如@assylias指出的,您询问是否可以删除new
关键字。答案是否定的。这不会编译:
public Double squareRoot(Double d)
{
return Math.sqrt(d);
}
错误为“预期方法调用”。不能将类的构造函数作为方法调用。只能通过在构造函数前面放置new
关键字来调用构造函数 是的,只要您使用Java5或更高版本,它仍然可以工作(前提是您还删除了Math.sqrt(d)
)周围的括号)。该特性称为自动装箱/自动取消装箱,这意味着JVM将自动在其相应的包装器类型中包装一个原语
但是,编写返回新的Double(Math.sqrt(d))
的缺点是效率稍低。如果使用return Double.valueOf(Math.sqrt(d))
(或者只使用return Math.sqrt(d);
,则第一个选项将创建一个新的Double
对象,而后两个选项将尝试重用先前创建的Double
实例
有关详细信息,请参阅Javadoc。这个新的Double(Math.sqrt(d.doubleValue());
涉及将原语类型Double
转换为其包装类Double
,反之亦然。但这是不必要的。相反,您可以执行返回Math.sqrt(d)
,这是自动装箱和取消装箱的示例
自动装箱是Java编译器在基元类型和它们相应的对象包装类之间进行的自动转换。例如,将int转换为整数,将double转换为double,等等。如果转换方向相反,则称为取消装箱
您没有使用名为“returnnew”的内容,而是使用以下代码:
public Double squareRoot(Double d)
{
return Double (Math.sqrt(d.doubleValue()));
}
事实上
newdouble(Math.sqrt(d.doubleValue())
(它使用Math.sqrt(d.doubleValue())的值创建一个新的Double对象)
返回步骤1的值
Double
的对象和类型为Double
的值之间进行自动转换。因此,您不需要使用new Double(…)
显式创建对象,因为Math.sqrt(…)
返回一个值double
。Java将自动为您执行此操作。参数d
:您不需要对其调用doubleValue()
因此,您可以将代码更改为:
return new Double (Math.sqrt(d.doubleValue()));
或者更好地使用原语double
作为类型为double
的对象,在这里并不真正需要:
public Double squareRoot(Double d) {
return Math.sqrt(d);
}
或者更好的是(正如Forival在对另一个答案的评论中指出的那样),不要为这个方法操心,只需调用
Math.sqrt(…)
直接使用。您尝试过吗?您是否了解正在发生的事情并想知道为什么会有“new”或您只是问一下?新的运算符不应与原始值一起使用。这是由于自动装箱,您可以在自动装箱上找到很多问题(例如).提到自动装箱将使您的答案更加完整“如果删除新的,是否仍然有效?”的答案是否定的。@assylias为什么不?自动装箱不是为您调用的吗?我不认为OP只是删除关键字new
,他们的意思是删除new Double()
并保留内容。也许他没有?你可以删除更多的代码——无论在哪里使用这个函数,只要使用Math.sqrt
为什么在返回示例中的值之前需要创建一个对象?实际上是(Oracle)中Double.valueOf(…)
的当前实现Java 7只是返回新的Double(d);
因此它实际上不会缓存任何东西即使对于Java 7,Javadoc明确指出它“通过缓存频繁请求的值,可能会产生显著更好的空间和时间性能”。可能是本机JVM代码处理了它?据我所知,不是这样,如果你看看例如Integer
中的等效方法,那么它实际上处理了缓存。有趣的问题……从技术上讲,Javadoc只建议可能会发生缓存,所以API文档和实际实现之间没有差异:)是的,也许当他们设计API时,他们认为会缓存它,但后来决定这是不可行的(哪些值通常用于缓存,哪些值不可用)。对于整数类型,这是一个更容易的决定。为什么在返回值之前必须创建一个对象?这不是要返回一个double
,而是要返回一个double
(这是一个不可变的对象),那么除了创建一个新的对象之外,还有其他选择。这可以使用new double>显式完成(..)
或Double.valueOf(..)
或隐式使用从Double
到Double的自动装箱。
public double squareRoot(double d) {
return Math.sqrt(d);
}