基本数据封装类

 

  既然Java中所有元素皆为对象的表现形式。那么基本数据类型也不例外。

 

  基本数据类型封装类的作用就是将原有8种基本数据类型封装成类。他们的对应关系如下:

 

boolean     Boolean
byte       Byte
char         Character
short       Short
int       Integer
long      Long
float       Float
double      Double

   除了Character与Integer以外,其它6种类型皆以基本类型名首字母大写为类名。

 

  基本数据类型封装类extends自Number类,而Number的基类是Object,基本数据类型封装类对每一种基本类型做了更详细的描述和功能扩展。如,取值范围,类型转换,进制转换等。

 

  首先在构造上基本数据类型封装类(除Character外)都支持通过一个String类型来构造实例对象,自动将String转换成对应的基本数据。

 

  基本数据类型封装类最常用的操作就是在基本数据与字符串之间做转换。

 

  通过基本数据类型封装类覆盖Object类的toString方法可以直接将一个基本数据转为字符串。

 

  整数类型还提供了toBinaryString,toHexString等进制转换的静态函数。浮点数类型提供了16进制转换。

 

  基本数据类型封装同样封装了compareTo equals等比较方法。

 

   除了Character外其它7种类型都有parseXxxxx()方法,(其中Xxxxx为类型名)。该方法为静态方法,可以将参数内指定的字符串转换成对应的类型。如:Integer.parseInt("0123456789")返回一个int 123456789。如果参数内有不是数字的内容会报 NumberFormatException异常。

 

  整数类型还提供了两个参数的parseXxxxx()方法,第一个参数是要转换的字符串,第二个参数是指定的原进制数,即可以通过该方法,将一个2进制或16进制数的字符串表现形式转换为一个10进制的整数。 

 

   在Java1.5版本后增加称为自动装箱的特性,其实就是为基本数据类型封装类提供了隐式构造Integer num = 5;相当于调用了Integer带一个int参数的构造函数,Integer num = new Integer(5);区别仅在于前者的5是存放在常量区中,而后者的5是在堆区中。

 

  所有基本数据类型封装类都重载了与对应的基础类型的所有运算符,所以使用基本数据类型封装类对象如同使用基本类型一样可以做一切运算操作。也可以使用一个基本数据类型封装类的对象与一个对应的基本类型做一切运算操作。如:

Integer num = 5;
num + num;
num + 1;

  有一点必需要注意,基本数据类型封装类的 == 与 != 运算符比较是地址即两个对象引用的值而不是封装数据的值。而<,>,<=,>=等运算符比较的却是值。这点好容易混乱。原因是因为java中Object重载了==与!=而基本数据类型封装类也派生自Object所以也继承了这两个重载运算符,但基本数据类型封装类本身也重载了其它运算符,却没有覆盖掉Object继承来的那两个。

 

  简单定规:基本数据类型封装类的运算中,== 和<= 是有区别的,如果两边都是基本数据类型封装类,那么==比地址,<=比值。如果有一边不是基本数据类型封装类,那么== 和 <=比的都是值。

 

  另外在这个新特性中加入了叫做享元模式的设置,该特性的特点是当Integer num1 = 5;Integer num2 = 5;时那么num1 == num2;为true;

 

  千万别误会这里比的中值,根据上面的理论。Integer num = 5 相当于Integer num = new Integer(5)

 

   而两个对象使用 == 比较的是引用本身,那为什么num1 == num2;为true呢?其实是因为当Integer num = 5中的5被隐式的封装成new Integer(5)时,在内存中使用了一个字节大小的常量空间将这个5记录,当再次Integer num2 = 5时。该存放5的常量内存区被重复使用,也就是说这里的num1与num2引用提向的是同一块内存。

 

  既然用来记录的这块内存大小为一个字节,那么也就是说该内存可以存放的值是127~-128之间。当值超过这个范围后,基本数据类型的享元模式自动失效。即: Integer num1 = 128;Integer num2 = 128;时那么num1 == num2;为false;

 

  这种享元模式同样适用于其它一个字节可以表示的基本类型,如long short char byte boolean。甚至于当:long lnum = 88; short snum = 88;lnum == snum;为true。

 

   不难看出享元模式的出现是为了节省内存,但从基本数据类型封装类的运算符不统一以及享元模式只支持一个字节的情况来看, 基本数据类型封装类的设计很混乱,还有很多过于重复的方法,比如:valueOf  parseInt  decode 功能基本一样,完全多余。感觉基本数据类型封装类像是硬塞进去的功能一样。

 

  Java语法诞生不足20年,可能有很多不足之处还需要不断的修整与改进。比如这里的基本数据类型封装类还有泛型,设备图形接口API。我认为都是须要改进的地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值