黑马程序员技术交流社区

标题: 求高手解答 [打印本页]

作者: 戎石锁    时间: 2012-8-16 16:57
标题: 求高手解答
class Demo
{
        public static void main(String[] args)
        {
                Integer i=300;
                Integer i=300
                System.out.println(i==i);//居然是false。,有意思
        }
}

/*
浏览别的JAVA论坛时,发现了这样一个问题,求解

1,这个代码,我编译是会出错,但是好多人都编译通过了,不知道为什么?
不要问代码是否写错了,代码是我复制过来的,而且那个论坛还有回答,就没有人回答这个为什么会编译通过。

2,如果编译通过,i==i真的是false吗,为什么?
        
*/

作者: 黑马-郑鹏    时间: 2012-8-16 17:53
首先:
class Demo
{
        public static void main(String[] args)
        {
                Integer i=300;
                Integer i=300  //你这代码这里没有分号,指定编译不过
                System.out.println(i==i);//居然是false。,有意思
        }
}
其次,这里定义的两个变量的名字都是i,应该也编译不过呀。
   Demo.java:6: 已在 main(java.lang.String[]) 中定义 i
                Integer i=300;
                        ^
我不知道别人是怎么编译通过的,我也感觉挺奇怪的。

作者: 戎石锁    时间: 2012-8-16 18:13
黑马-郑鹏 发表于 2012-8-16 17:53
首先:
class Demo
{

我也正郁闷编译这个问题呢,哎哎哎
作者: 黑马_许芸    时间: 2012-8-16 18:17
先把楼上的问题解决了。然后呢,你再把这两个整数的值设置在-128——127的范围内,就可以得到true,超出这个范围就是false。这是因为,Integer类有一个缓存,它会缓存介于-128~127之间的整数。超出这个范围的整数不在缓存中,自然每次都会在堆中生成新的对象,用==来判断就是false了。这个问题不重要,没有什么好纠结的,你都用equels不就好了。
作者: 黑马-郑鹏    时间: 2012-8-16 18:25
那我们怎么连编译的通不过呢?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2