首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回新的目的?

返回新的目的?
EN

Stack Overflow用户
提问于 2013-04-04 01:41:13
回答 4查看 1.2K关注 0票数 0
代码语言:javascript
运行
复制
public Double squareRoot(Double d)
{
return new Double (Math.sqrt(d.doubleValue()));
}

"return new“的目的是什么?如果删除了"new“,它还能正常工作吗?

EN

回答 4

Stack Overflow用户

发布于 2013-04-04 01:42:03

是的,事实上你可以删除更多的代码:

代码语言:javascript
运行
复制
public Double squareRoot(Double d)
{
    return Math.sqrt(d);
}

即使Math.sqrt返回的是double而不是Double。这是由一个名为Autoboxing的java特性完成的。

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

代码语言:javascript
运行
复制
public Double squareRoot(Double d)
{
    return Double (Math.sqrt(d.doubleValue()));
}

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

票数 9
EN

Stack Overflow用户

发布于 2013-04-04 01:50:16

您使用的不是名为“return new”的代码,而是以下代码:

代码语言:javascript
运行
复制
return new Double (Math.sqrt(d.doubleValue()));

实际上是这样的

  1. new Double (Math.sqrt(d.doubleValue())) (用step 1

Math.sqrt(d.doubleValue())

  • return值创建一个新的双精度对象

Java还有一个称为autoboxing的概念,它允许Double类型的对象和double类型的值之间的自动转换。因此,您不需要使用new Double(...)显式创建对象,因为Math.sqrt(...)返回值为double。Java将自动为您完成这项工作。同样的道理也适用于参数d:您不需要对它调用doubleValue()

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

代码语言:javascript
运行
复制
public Double squareRoot(Double d) {
   return Math.sqrt(d);
}

或者更好的是,使用原语double作为Double类型的对象在这里并不是真正必要的:

代码语言:javascript
运行
复制
public double squareRoot(double d) {
   return Math.sqrt(d);
}

或者更好(就像在对另一个答案的注释中指出的那样),不要为这个方法费心,只需直接调用Math.sqrt(...)

票数 2
EN

Stack Overflow用户

发布于 2013-04-04 01:49:37

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15794291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档