读书人

一条基础标题还是不太懂底层的东西

发布时间: 2013-09-04 10:34:09 作者: rapoo

一条基础题目,还是不太懂底层的东西


public static void main(String[] args) {
Long lo = new Long(1);
Integer a = new Integer(1);
int aa = 1;
System.out.println(lo.equals(a)); //false
System.out.println(lo==aa); //true
System.out.println(lo==a); //编译错误
}



为什么
System.out.println(lo==aa)
会输出true呢?


System.out.println(lo.equals(a))
则输出false呢?

想听听前辈们的意见


[解决办法]
System.out.println(lo==aa):因为lo先自动拆箱成long类型,值为1,而aa的值也是1,因此true。
System.out.println(lo.equals(a)):因为在Long类的JDK实现中:

boolean equals(Object obj)
{
if(!obj instanceof Long) return false;
}

也就是说,只要传入的参数不是一个Long类型,都是返回false。


[解决办法]
引用:
System.out.println(lo==aa):因为lo先自动拆箱成long类型,值为1,而aa的值也是1,因此true。
System.out.println(lo.equals(a)):因为在Long类的JDK实现中:

boolean equals(Object obj)
{
if(!obj instanceof Long) return false;
}

也就是说,只要传入的参数不是一个Long类型,都是返回false。


正解。
再看看生成的class反编译后的代码就清楚了

public static void main(String[] args)
{
Long lo = new Long(1L);
Integer a = new Integer(1);
int aa = 1;
System.out.println(lo.equals(a));
System.out.println(lo.longValue() == aa);
}


读书人网 >J2SE开发

热点推荐