我们都知道Java是面向对象的语言,但是它提供的8种原始的数据类型(byte,short,int,long,float,double,char,boolean)却不是面向对象的。但是,Java又为每一个原始类型提供了各自的包装类(Byte,Short,Integer,Long,Double,Float,Character,Boolean)。究竟Java为什么要这样做呢?
一、为什么要使用原始类型(也叫基本类型)
站在Java程序员的角度来看,我们可以确认“原始类型不是对象”,它不存在封装、继承、多态这些概念,不在面向对象体系之内。但是在JVM中,它会为所有的基本类型创建一个对象,所以在JVM内部,原始类型就是对象。(注:这里我是参考的别人的博客,他里面有详细的解释,文章末尾有原文链接)那既然如此,我们为什么不直接使用对应的包装类对象,而要使用原始数据类型呢?
大家应该都能想到,JVM为原始类型创建的对象,和我们直接创建对应包装类对象,在JVM里的内部实现肯定是有区别的。为原始类型创建对象,在JVM内部是很轻量级的,相比后者做了许多优化。因此,使得原始类型的功能减少(应该讲已经优化的没有功能了,所以其内部没有任何方法可以供我们调用),但是却获得了更快的执行速度,这个是非常关键的一点。原始类型大量存在于我们的代码中,例如一个循环就要使用一个int类型的数据很多次,使用原始类型与创建对象相比,速度要提升很多很多。
二、为什么要存在包装类
前面我们提到,原始类型是不包含方法的,但是有时我们又有一些常用的操作,如果Java不给我们提供,我们就要自己去定义实现,比如:将字符串转换为基本值的操作(parseInt()),生成字符串表示的操作(toString())等等。不过,Java的包装类都为我们提供了这些方法,我们只需要在用到的时候进行调用就可以了。但是如果我们一开始定义的是原始类型,而不是创建它们的对象,那我们怎么调用Java给我们提供的方法呢?这就牵扯到装箱和拆箱了,通过装箱与拆箱,int和Integer来回转换。
三、装箱和拆箱
(手动)装箱和拆箱:就是将原始类型转换成对象,例如通过Integer类将int装箱。相反,拆箱就是将对象转换为原始类型。
int n = 3;
Integer obj = new Integer(n);//装箱
int m = obj.intValue();//拆箱
自动装箱和拆箱:以上是我们进行手动的装箱和拆箱,Java1.5后可以实现自动装箱和拆箱操作。例如:
int n =3;
integer obj = n;//自动装箱
int m = obj;//自动拆箱
参考:http://blog.csdn.net/qq_35101189/article/details/53580685
在对这个知识点进行梳理的过程中,我发现了程序员一个新的看待问题的角度,就是“换位思考”。拿我们这篇文章讲的内容举个例子:原始数据类型在程序员看来,并不是一个对象,所以我们不是以创建对象的方式创建它,也无法像使用一个对象一样去调用它,它在程序员看来只是一个变量。但是在JVM中,JVM是把原始类型当作对象来处理的,原始类型在它真实的运行环境中是接受的对象的待遇,只不过进行了特殊的优化处理。所以本质上,原始类型就是一个对象,一个经过特殊优化的对象。
程序员是APP的创造者,我们开发出各式各样的APP给用户使用,用户只能使用我们开发出的功能;但我们同时也是使用者,是开发语言的使用者,我们只能在编程语言的规范、标准下使用它。
产品经理在设计一款产品时,需要换位思考,要站在用户的角度去设计,思考如何让界面更加友好,操作更加顺手,功能是否能满足用户的需要等等。我想程序员在敲代码时,有时也要站在编程语言的角度去思考问题,我们可能经常会困惑这行代码为什么要这样写,Java设计者为什么要这样设计等等一些不太容易理解的问题上,如果此时我们深入Java(及其它编程语言)的世界当中,站在它的角度来思考,或许就会豁然开朗。
以上是我在写这篇文章过程中突发灵感,然后就记录下来了,靠谱性还有待实践检验……
网友评论