基本数据类型的自动封装与拆箱

  1. public class Test { 
  2.     /**
  3.      * @param args
  4.      */ 
  5.     public static void main(String[] args) throws Exception { 
  6.  
  7.     (1) Long t = new Long(1); 
  8.     (2) System.out.println(t+1); 
  9.          
  10.     (3) Long t2 = t + 1
  11.     (4) System.out.println(t2); 
  12.     } 
public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {

	(1)	Long t = new Long(1);
	(2)	System.out.println(t+1);
		
	(3)	Long t2 = t + 1;
	(4)	System.out.println(t2);
	}
}

(2)t+1过程:t.longValue + 1;
(3)t+1过程:t.longValue + 1得到long型值A,再调用Long.valueOf(A)变成Long给t2.



javap的代代码:
  new     #19; //class java/lang/Long
  dup
  lconst_1
  invokespecial   #21; //Method java/lang/Long."<init>":(J)V
  astore_1
  getstatic       #24; //Field java/lang/System.out:Ljava/io/PrintStream;
  aload_1
  invokevirtual   #30; //Method java/lang/Long.longValue:()J
  lconst_1
  ladd
  invokevirtual   #34; //Method java/io/PrintStream.println:(J)V
  aload_1
  invokevirtual   #30; //Method java/lang/Long.longValue:()J
  lconst_1
  ladd
  invokestatic    #39; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;

  astore_2
  getstatic       #24; //Field java/lang/System.out:Ljava/io/PrintStream;
  aload_2
  invokevirtual   #43; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V


另外,注意在做等值比较时,要注意了,因为这里非常容易被忽略而导致程序bug。
它们是按照声明的类型进行的,如果有基本数据类型,则封装类会自动转型为基本数据类型再进行比较;如果封装类使用equals,则后面的基本数据类型自动转成封装类:
Java代码
  1. Integer t1 = new Integer(1);//等同于:Integer t1 = 1; 
  2. Integer t2 = new Integer(1);//等同于: Integer t2 = 1; 
  3. 5)System.out.println("t1==t2:" + (t1==t2)); 
  4. 6)System.out.println("t1==1:" + (t1==1)); 
  5. 7)System.out.println("t2==1:" + (t2==1)); 
  6. 8)System.out.println("t2.equals(1):" + (t2==1));[/ 
		
  Integer t1 = new Integer(1);//等同于:Integer t1 = 1;
  Integer t2 = new Integer(1);//等同于: Integer t2 = 1;
  (5)System.out.println("t1==t2:" + (t1==t2));
  (6)System.out.println("t1==1:" + (t1==1));
  (7)System.out.println("t2==1:" + (t2==1));
  (8)System.out.println("t2.equals(1):" + (t2==1));[/

输出为:
t1==t2:false
t1==1:true
t2==1:true
t2.equals(1):true

原因:
(5):t1 t2都按封装类进行等值比较,属于不同的对象,所以不相等;
(6):t1自动转成int型,再与1相比,值是相等的;
(7):t2自动转成int型,再与1相比,值是相等的;
(8):1自动转成new Integer(1),再与t2做equals,他们的值也是相等的。

建议:用equals来替换==,这样可以省去麻烦,避免错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值