一, 先了解一下 JDK1.5 的新特性:自动装箱和自动拆箱
这里我们先了解一下 JDK1.5 的新特性:自动装箱和自动拆箱
//自动装箱--自动将基本数据类型,变成对象,变量对应的包装类
//自动拆箱--自动将对象转成回基本数据类型
大家来看看这样定义k 对不对,猜对了有奖
Integer k=100; //Integer是一个引用数据类型,又是一个对象
//100默认是一个基本数据类型
//我们相当于把基本数据类型赋值给一个对象
// 对象 = 基本数据类型
我们发现在JDK1.5之后写上面这行代码不会出错,原因就是java的底层帮我们自动调用了valueof方法,我们称这一步叫做自动装箱,
我们看看编译后上面这句话是什么样的
//Integer k=Integer.valueOf(100);
//我们在valueof源码中new 了一个Integer();
我们输出k System.out.println(k); 答案是100;原因是在Integer类中重写了tostring方法
二, 这里我们插入举个栗子说明自动拆箱自动装箱
输出
三, 言归正传(操作)
我们对k进行操作
k+=100;//k=k+100
System.out.println(k);
在这里我们是对Integer类型的k 进行操作,引用类型不能和基本类型做运算,但是输出k=200
原因是在这一步我们的K被还原回了基本类型(自动拆箱),但是K+100以后就变成基本数据类型了,所以K+100完了以后还要装箱回去
他的内部实现,这一步既有拆箱又有装箱
Integer k=100;//自动装箱机制
k+=100; //k=k+100,K先变基本类型,
//再做加法等于200
//再把基本数据类型200自动装箱变成Integer对象赋值给k
System.out.println(k);
//上面三行代码相当于进行了下面三行的操作
Integer k=Integer.valueOf(100);
k=Integer.valueOf(k.intValue()+100);
System.out.println(k);
四, bug要来了! 细节细节细节!看下面
众所周知,只有我不知,引用数据类型都有一个公共值叫NUll
所以我们进行这一步
Integer kk=null;
kk+=100;
System.out.println(kk);
控制台出现空指针异常
原因是 NUll可以赋值给引用数据类型,不可以转成基本数据类型
所以这里我们需要进行 if 判断
Integer kk=null;
if (kk!=null){
kk+=100;
System.out.println(kk);
}
另附上全文代码
public class Main {
public static void main(String[] args) {
Integer k=100;
//Integer是一个引用数据类型,又是一个对象
//100默认是一个基本数据类型
//我们相当于把基本数据类型赋值给一个对象
// 对象 = 基本数据类型
/*Integer i=Integer.valueOf(10);*/
// System.out.println(k);
k+=100;//k=k+100
System.out.println(k);
/* Integer k=Integer.valueOf(100);
k=Integer.valueOf(k.intValue()+100);
System.out.println(k);*/
Integer kk=null;
if (kk!=null){
kk+=100;
System.out.println(kk);
}
}
}