可能重复:
Java:比较不同的双精度和双精度
在我的一个实验室的示例 java 程序中,我有两种不同的方法,分别采用 Double 和 double 参数。
向它们传递参数时如何区分它们?
可能重复:
Java:比较不同的双精度和双精度
在我的一个实验室的示例 java 程序中,我有两种不同的方法,分别采用 Double 和 double 参数。
向它们传递参数时如何区分它们?
Double
参数可以是null
什么时候double
不能。
首先,您需要了解这两种类型之间的区别。
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"
- double
是原始类型,其中 asDouble
是包装对象。
- Wrapper 对象最常见的用途之一是与Collection
.
例如:
List<Double> d = new ArrayList<Double>();
-在Java 5Autoboxing
中,引入了一种称为直接在两者之间转换的机制。
例如:
double d = 10.41;
Double wrapper = d;
Double
是引用类型,double
也是值类型。
该类
Double
将原始类型 double 的值包装在一个对象中。Double 类型的对象包含一个类型为 double 的单个字段。”链接
正如@Fess 提到的,因为Double
它是引用类型,所以它可以是null
.
如果你愿意,你可以明确地将 from 转换Double
为double
with.doubleValue()
方法,反之亦然new Double(1.0)
。
正如@millimoose 所说:
您应该使用
X.valueOf()
而不是new X()
. 允许这些valueOf
方法缓存装箱类型以减少内存使用。(不确定这是为Double
s 完成的,但这是一个养成的好习惯。)”
// 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也会被调用,因为类型是; 对象被拆箱为. 同样,如果您有:d
double
Double
double
Double d = 1.0;
然后将调用方法 Ad
,因为类型 of将是Double
(double
-literal 自动装箱为 a Double
)。
Double 是一个包装类,而 double 是像 c/c++ 这样的原始类型。如上所述,Double 主要用于泛型,但在需要数值和适当的对象封装的任何地方也很有用。在大多数情况下,Double 和 double 可以互换使用。
您所拥有的是方法重载的示例。好的部分是编译器和 JVM 将根据您调用方法时使用的参数类型自动选择正确的方法。