15

可能重复:
Java:比较不同的双精度和双精度

在我的一个实验室的示例 java 程序中,我有两种不同的方法,分别采用 Double 和 double 参数。
向它们传递参数时如何区分它们?

4

7 回答 7

33

Double参数可以是null什么时候double不能。

于 2012-11-11T14:33:44.067 回答
26

首先,您需要了解这两种类型之间的区别。 double是原始类型,Double而是对象。

下面的代码显示了一个重载的方法,我假设它类似于您的实验室代码。

void doStuff(Double d){ System.out.println("Object call"); }
void doStuff(double d){ System.out.println("Primitive call"); }

您可以通过多种方式调用这些方法:

doStuff(100);
doStuff(200d);
doStuff(new Double(100));

这些调用将导致:

"Primitive call"
"Primitive call"
"Object call"
于 2012-11-11T14:39:55.843 回答
4

- double是原始类型,其中 asDouble包装对象

- Wrapper 对象最常见的用途之一是与Collection.

例如:

List<Double> d = new ArrayList<Double>();

-Java 5Autoboxing中,引入了一种称为直接在两者之间转换的机制。

例如:

double d = 10.41;
Double wrapper = d;
于 2012-11-11T14:50:19.767 回答
1

Double是引用类型,double也是值类型。

该类Double将原始类型 double 的值包装在一个对象中。Double 类型的对象包含一个类型为 double 的单个字段。”链接

正如@Fess 提到的,因为Double它是引用类型,所以它可以是null.

如果你愿意,你可以明确地将 from 转换Doubledoublewith.doubleValue()方法,反之亦然new Double(1.0)

正如@millimoose 所说:

您应该使用X.valueOf()而不是new X(). 允许这些valueOf方法缓存装箱类型以减少内存使用。(不确定这是为Doubles 完成的,但这是一个养成的好习惯。)”

于 2012-11-11T14:35:07.297 回答
1
// Method A
public static void foo(Double d) {...}

// Method B 
public static void foo(double d) {...}

显然,如果你传递一个Double对象,那么方法 A将被调用;即,如果你有类似的东西:

Double d = new Double(1.0);

此外,如果您传递一个双重文字,您将调用Method B。有趣的是,如果你有类似的东西

double d = new Double(1.0);

在这种情况下,方法 B也会被调用,因为类型是; 对象被拆箱为. 同样,如果您有:ddoubleDoubledouble

Double d = 1.0;

然后将调用方法 Ad ,因为类型 of将是Doubledouble-literal 自动装箱为 a Double)。

于 2012-11-11T14:35:42.003 回答
1

Double 是一个包装类,而 double 是像 c/c++ 这样的原始类型。如上所述,Double 主要用于泛型,但在需要数值和适当的对象封装的任何地方也很有用。在大多数情况下,Double 和 double 可以互换使用。

于 2012-11-11T15:09:52.507 回答
0

您所拥有的是方法重载的示例。好的部分是编译器和 JVM 将根据您调用方法时使用的参数类型自动选择正确的方法。

于 2012-11-11T14:39:53.740 回答