A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戎石锁 中级黑马   /  2012-8-16 16:57  /  1996 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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吗,为什么?
        
*/

4 个回复

倒序浏览
首先:
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 17:53
首先:
class Demo
{

我也正郁闷编译这个问题呢,哎哎哎
回复 使用道具 举报
先把楼上的问题解决了。然后呢,你再把这两个整数的值设置在-128——127的范围内,就可以得到true,超出这个范围就是false。这是因为,Integer类有一个缓存,它会缓存介于-128~127之间的整数。超出这个范围的整数不在缓存中,自然每次都会在堆中生成新的对象,用==来判断就是false了。这个问题不重要,没有什么好纠结的,你都用equels不就好了。
回复 使用道具 举报
那我们怎么连编译的通不过呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马