Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 退货的目的是什么?_Java_Return - Fatal编程技术网

Java 退货的目的是什么?

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

“还新”的目的是什么?如果删除了“new”,它还会工作吗?

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

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的值
  • Java还有一个称为的概念,它允许在类型为
    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);
    }