Possible Duplicate:
Java : different double and Double in comparison
在我的一个实验室的Java程序中,我有两种不同的方法,分别采用双参数和双参数。在向他们传递参数时,我如何区分它们?
- 顺便说一句,这些方法除了参数外,都有相同的签名。
- 相关:比较不同的双精度和双精度
- 为什么不显示你的代码?
- 这是他们给我们的一个存根类。所以,这不是真的,而是:
- 对不起,我是个新手。如何将代码粘贴到此处?
- @马哈茂德编辑你的问题。
Double参数可以null当Double不能。
- 不,我的问题是我想调用这些方法。所以,当我向他们传递论据时,我不知道它会指向哪一个。接受双倍还是接受双倍?
- @Mahmoud总是强迫它使用原始的double版本,在传递参数之前强制double将其解装箱为double。
- @真正的马哈茂德,原始的双打通常是最好的。
- @安德鲁,在这种情况下我不能。这是实验室说明的一部分。
- @它取决于参数的静态类型。如果它是原语类型,它将转换为double,并用原语调用重载。如果参数的静态类型是类double,那么它将使用装箱类型调用重载。
- @马哈茂德,如果你有方法(接口)允许你设置double,这意味着你可以提供null,不会发生崩溃。
- @马哈茂德(值得一提的是,我发现学校作业中的这类事情令人恼火。先教好实践,然后再让你练习细节和边缘案例,这会更负责任。)
首先你需要理解之间的差别的两个类型。而DoubleDouble是一个原始类型是一个对象。
下面的代码显示的方法其中一个过重,认为相似的实验室代码。
1 2
| void doStuff (Double d ){ System. out. println("Object call"); }
void doStuff (double d ){ System. out. println("Primitive call"); } |
有几个方法,你可以调用方法:论文
1 2 3
| doStuff (100);
doStuff (200d );
doStuff (new Double(100)); |
研究结果:想在电话
1 2 3
| "Primitive call"
"Primitive call"
"Object call" |
- 谢谢。真是太有帮助了。根本不知道200天。
- 我发现以下信息在理解差异时更有用:double是double类型的简单数字。双人房是一门课。它包含一个double类型的单个字段,但具有内置函数,如.toString()和floatValue(),并且可以扩展。如果使用"double",则需要执行string.valueof()以获取其字符串,但使用double,则只需执行.toString()。
- 什么时候用第一个,什么时候用第二个?
Double-是一个原始类型,在AS Double是一个包装对象。
一个最普通的使用对象是一个Collection包装。
电子商务:
1
| List<Double> d = new ArrayList<Double>(); |
在Java 5 a机制已被引入到Autoboxing转换之间的直接。
电子商务:
1 2
| double d = 10.41;
Double wrapper = d ; |
- 包装对象不与泛型一起使用,它们在泛型之前用于在集合中存储基元类型。它们也用于其他调用可空类型的上下文中。(尤其是执行ORM时的实体ID。)
1 2 3 4 5
| // Method A
public static void foo (Double d ) {... }
// Method B
public static void foo (double d ) {... } |
如果你的护照evidently Double对象A,然后A的想法;如果你有什么样的:。
如果你继续,你要呼叫的文字通双法B.什么是有趣的是,如果你有什么样
因此,本案例中的想法B,因为类型是Doubled;Double对象得到一个Double装箱。在同样的注意,如果你有:
然后我们的方法称为A型,因为d会Double(Double-而得到一个Doubleautoboxed)。
- 一个重要的旁白是,如果你需要做这种区分,它可能是一种代码味道。理想情况下,其中一个重载应该环绕另一个重载。(事实上,在任何一组重载中,大多数重载最终都应该委托给其中一个重载或单个私有实现方法。)
- "double d=new double(1.0)"不是子类/超类问题。D是double的一个实例化"不是真的。它不是double的实例化。您正在创建一个对象double,然后将其取消装箱为double。从本质上说,这是一个无用的陈述。
- "然后将调用方法A,因为d的类型将是double(而不是double)"—仍然是错误的。d就是double,你就是这么宣布的。
- Autoboxing不允许变量同时为两种类型,也不允许变量与声明的类型不同。编译器所做的全部工作就是自动插入装箱和取消装箱代码。这意味着double d1 = new Double(1.0);被编译为double d1 = new Double(1.0).doubleValue();。相反,Double d2 = 1.0;被编译成Double d2 = Double.valueOf(1.0);。在任何情况下,double型的d1或double型的d2都不是。
- @米莉穆斯谢谢-那是个打字错误。
- @Andrewfinnell也谢谢你-我编辑是为了反映你的评论。
- @millimoose&andrewfinnell thanx伙计们。虽然这对我来说有点复杂(我是软件专业的一年级学生),但我仍然可以设法解决这个问题。
是一个双舱双包装,是一个原始类型的C / C + +类。以上为双圆外,大多是用在有用的地方是仿制药,但也需要有一个对象的两个数值的和适当的中草药。在大多数情况下可以用"双和双interchangeably。
你有一个example of方法重载。这是一个很好的编译器和JVM自动选择正确的方法基于类型的参数,是用来当你呼叫的方法。
Double是参考型和Double是值类型。
The Double class wraps a value of the primitive type double in an object. An object of type Double contains a single field whose type is double." link
为保持和Double@ FESS是因为它可以null参考类型。
如果你想你可以转换从一个explictly DoubleDouble.doubleValue()viceverrsa new Double(1.0)方法提供。
所以他说:"millimoose
You should use X.valueOf() instead of new X(). The valueOf methods are allowed to cache the boxing types to reduce memory use. (Not sure this is done for Doubles but it's a good habit to get into.)"
- 您几乎不需要再进行这种显式转换了。Autoboxing将根据上下文为您插入对doubleValue和valueOf的调用。
- 是的,我知道。我把答案改为"如果你想要你…"。这几乎与stackoverflow.com/questions/12846624/&hellip;的问题相同。
- 另外,我认为你应该使用X.valueOf()而不是new X()。允许valueOf方法缓存装箱类型以减少内存使用。(不确定这是为double做的,但这是一个好习惯。)
- 是的,我很快就写下了我的答案,但我没有写出来。我会编辑我的答案,把你之前的评论放在最后