`
talentluke
  • 浏览: 592602 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Integer疑难

 
阅读更多
Java代码  收藏代码
  1. public   static   void  main(String[] args) {  
  2.       
  3.         Integer a=200 ;  
  4.         Integer b=200 ;  
  5.         int  c= 200 ;  
  6.         System.out.println("a==c  " +(a==c));  
  7.         System.out.println("b==c  " +(b==c));  
  8.         System.out.println("a==b  " +(a==b));  
  9. }  


请问LZ,对于这段代码的运行结果是:
Java代码  收藏代码
  1. a==c   true   
  2. b==c  true   
  3. a==b  false   


既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢?




我绝对大家要学会看.class文件

Integer a=200;
int c=200;
System.out.println("a==c");

被编译器这样编译:

Integer a=Integer.valueOf(200); 这个时候引用a存储的是堆栈中Integer对象的地址 (注意a是对象引用)
int c=200; 编译器把常量200写进常量池,然后栈中的变量c里面存放的就是这个值200 (注意c是变量名)
int temp=a.intValue();  大家可以去看看intValue()的源代码,实际上编译器并没有temp这样的变量,而直接把intValue()的返回结构压入操作数栈。我这些写实为了大家明白过程(不存在temp的).

System.out.println(temp==c);

大致的过程就是这样
总结一下:
(1) 当把一个整形常量或变量直接赋值给Integer引用时,比如 Integer a=200, 或 int b=200; Integer a=b;
    这是编译器会调用Integer.valueOf()方法来自动打包int基本类型。
(2) 当比较一个Integer对象和一个int基本类型变量的时候,编译器会调用Integer对象.intValue()将Integer对象自动拆包,然后比较两个整形变量。

注意编译器给我们做了很多工作,大家不要忘记了他的辛苦。要把它的汗水记得明明白白它的心!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics