package app;public class jdbc { public static void main(String[] args) {
Double d = new Double (4.2);
System.out.println(d.equals(4.2));
System.out.println(d==4.2);
}
}
运行结果:true
true第一个true容易理解,Double类里重写了equals方法,equals比较Double对象里值是否相等,
第二个如何理解呢?
按照常理,d是一个对象的引用,"栈"里存放的是对象的地址,怎么会等于4.2呢?
高手赐教
Double d = new Double (4.2);
System.out.println(d.equals(4.2));
System.out.println(d==4.2);
}
}
运行结果:true
true第一个true容易理解,Double类里重写了equals方法,equals比较Double对象里值是否相等,
第二个如何理解呢?
按照常理,d是一个对象的引用,"栈"里存放的是对象的地址,怎么会等于4.2呢?
高手赐教
public class SweetShop extends java.lang.Object{
public SweetShop();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/Double
3: dup
4: ldc2_w #3; //double 4.2d
7: invokespecial #5; //Method java/lang/Double."<init>":(D)V
10: astore_1
11: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
14: aload_1
15: ldc2_w #3; //double 4.2d
18: invokestatic #7; //Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
21: invokevirtual #8; //Method java/lang/Double.equals:(Ljava/lang/Object;)Z
24: invokevirtual #9; //Method java/io/PrintStream.println:(Z)V
27: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
30: aload_1
31: invokevirtual #10; //Method java/lang/Double.doubleValue:()D
34: ldc2_w #3; //double 4.2d
37: dcmpl
38: ifne 45
41: iconst_1
42: goto 46
45: iconst_0
46: invokevirtual #9; //Method java/io/PrintStream.println:(Z)V
49: return}从第十三行可以看出,JVM自动调用了Double的doubleValue()方法将Double转换成了double类型,也就是JDK5.0以上的新特性(自动拆箱功能)
对象放在堆中,基本数据类型压入栈,所以对象取引用,equls方法是比较两个对象的内容是否一样,而==是比较两个对象的引用是否一样,回答你的问题还是
JAVA5.0开始的新功能 自动拆箱(unboxing)
我现在对JDK5.0还是了解不多,惭愧!
试试
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a==b);
结果为False