java中的双重vs双重

可能重复:
Java:比较不同的double和Double

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

首先,您需要了解两种类型之间的区别。 double是基本类型,而Double是Object。

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

 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" 

double不能时, double参数可以为null

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

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

 Double d = new Double(1.0); 

此外,如果您传递双重文字,您将调用方法B. 有趣的是,如果你有类似的东西

 double d = new Double(1.0); 

在这种情况下,也会调用方法B ,因为d类型double ; Double对象被取消装箱为double 。 同样,如果你有:

 Double d = 1.0; 

然后调用方法A ,因为d的类型是Doubledouble -literal自动装箱到Double )。

double是一个基本类型,其中Double是一个包装器对象

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

例如:

 List d = new ArrayList(); 

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

例如:

 double d = 10.41; Double wrapper = d; 

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

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

Double类在对象中包装基本类型double的值。 Double类型的对象包含一个类型为double的字段。“ link

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

如果你想要你可以使用.doubleValue()方法明确地将Double转换为double ,并使用new Double(1.0)将其转换为.doubleValue()

同样@millimoose说:

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

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