在刚接触Java,还没接触到面向对象和类的概念的时候老师说什么那就是什么。记得那个时候老师要我们根据所学基础语法完成一道上机作业:
编辑
那个时候只知道定义两个数据类型的变量然后在输出语句中进行相应的换算达到目的,Eclipse里的那一段代码至今都还在:
编辑
当我深入了解到包装类的底层原理,突然发现以前的语法好像行不通。
其实短短的一行代码其实背后有巨大的学问,本质还是体现类的特性!
Integer integer=1;
这行代码为什么能成立?
按照类的特性,都知道=的左边对应的是编译类型,右边对应的是运行类型,上述代码中的1,就是一个普普通通的数值类型的常量,既没有创建相应的对象更没有发生类的加载,就别说保证为运行类型了
可为什么这种不符合规则的操作在开发工具里写出来不会报错呢?
首先能确定的是Integer是int的包装类,其次在JDK5以前有一个装箱,拆箱的概念:
装箱:把基本数据类型转换为对应的包装类类型
拆箱:把包装类类型转换为对应的基本数据类型
就像这样:
//手动装箱 Integer integer=Integer.valueOf(1); //手动拆箱 Integer integer2=1; integer2.intValue();
在旧版本JDK(JDK5之前)的基础上,装箱操作就是通过向valueOf()方法里传入基本数据类型然后通过方法本身的逻辑返回包装类类型达到类型匹配的效果,而拆箱就反之
这两者体现的是面向对象的特点——通过类加载,初始化类,调用类的成员方法等不同方式让对象的引用指向堆中的对象
我想这里大家会有疑惑,为什么没有通篇没有一个new你却说类加载了呢?因为查看源码可以发现,valueOf()是一个静态方法:
如图
编辑
而我们知道使用类的静态成员时,是会发生类的加载!这也就照应了面向对象中类的特性。
在新版本JDK的基础之上,装箱,拆箱的操作依然存在(毕竟是java语言本质的体现)只不过被开发者们简化了,以自动的隐式操作将手动装,拆箱代替。于是就有了如今这样的语法结构:
Integer integer =1;
感受至此,真的是在学习的过程中不断体会到开发JDK作者们的伟大,他们把复杂的逻辑以极其简单的方式呈现给我们,供我们使用。就像封装,继承,多态,接口.......都是在让代码变得越来越规范,让程序越来越简单。
所思所想,皆是收获,亦是分享~