首页 > 编程语言 > 详细

Java:对象包装类

时间:2017-02-19 18:11:21      阅读:223      评论:0      收藏:0      [点我收藏+]

对象包装类的背景:

Java语言是一个面向对象的语言,但是Java中的基本数据类型例如int,boolean却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。

对象包装类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。

同时,要注意对象包装类是final的,因此不能定义它们的子类。

 

对象包装类位于Java.lang包,不需要import

包装类对应表

基本数据类型

包装类

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double

 

这八种对象包装类,关于数值运算的六个(Byte,Short,Integer,Long,Float,Double)都是Number类的子类,具有一些共同的属性,以下以Integer为例子说明。

  1. Integer类
 1         Integer a=new Integer(10); //new 语句生成一个Integer对象,参数可以是int,也可以是String
 2         Integer b=Integer.valueOf(11); //调用静态方法valueOf,参数是int基本类型,生成Integer
 3         Integer c=Integer.parseInt("12");//调用静态方法parseInt,参数是String类型,生成Integer
 4         System.out.println(a.intValue()); //可以查看其包含的int值
 5         System.out.println(a.getClass()); //查看Integer类信息
 6         System.out.println(a.compareTo(b));//两个值进行比较,
 7         System.out.println(b.compareTo(a));//还有一个静态方法Integer.compare(int x,int y)
 8         System.out.println(a.equals(b)); //两个Integer对象是否相等
 9         System.out.println(Integer.max(a, b));//比大小
10         System.out.println(Integer.min(a, b));
11         System.out.println(c);

得到的结果是

10
class java.lang.Integer
-1
1
false
11
10
12

由上述代码可以看出,生成Integer类对象有三种方式。分别是用new语句,Integer.valueOf(int)和parseInt("12")。

其中max,min,compare等静态方法不用赘述了。

Integer==》int 则是调用intValue方法

Integer==》String,则是调用toString方法

1         String d=Integer.toString(12);
2         String e=Integer.toString(a);
3         System.out.println(d);
4         System.out.println(e);

结果是

12
10

  现在再看这两条语句

        Integer c=Integer.parseInt("12");
        int g=Integer.parseInt("12");

这两条都编译运行无误,为什么同样是Integer.parseInt("12"),得到的结果却可以是Integer对象,也可以是int基本类型呢。

这里就牵扯到一个概念:自动装箱(autoboxing),或者叫自动打包(autowrapping)

自动装箱就是系统自动进行的,把一个基本类型例如int的对象转成Integer对象的过程。

反过来,就叫自动拆箱。自动装拆箱是非常灵活的,甚至在算术表达式中都可以自动进行。

        Integer n=0;
        n++;
        System.out.println(n.getClass());
        System.out.println(n.intValue());

得到的结果是

1 class java.lang.Integer
2 1

但是自动装拆箱也会引入一些问题。

问题1)包装器类引用是可以为null的,而基本类型即使没有赋值也是有缺省值的,如果使用了一个null类型的包装器对象,则可能出现NullPointerException错误

    如代码

        Integer n=null;
        n++;

  会报如下错误

Exception in thread "main" java.lang.NullPointerException

 问题2)如果在算术表达式中混合使用Integer,Double等类型,会出现Integer拆箱,提升为Double,看起来是不错的结果,但可能不是你想要的结果。

2. Boolean类型

        Boolean b1=new Boolean("true");
        Boolean b2=new Boolean("tRue");
        Boolean b3=new Boolean("false");
        Boolean b4=new Boolean("morning");
        Boolean b5=new Boolean(false);
        Boolean b6=new Boolean(true);
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);
        System.out.println(b5);
        System.out.println(b6);
        System.out.println(b1.booleanValue());
        System.out.println(b1.compareTo(b2));
        System.out.println(b1.equals(b6));
        System.out.println(b1.valueOf(true));

  结果为

true
true
false
false
false
true
true
0
true
true

如果是想生成Boolean对象true,只能是String “TRUE”或“TRUe”等这个单词的大小写各种形式,或者是boolean类型true,而false则随意。

Boolean类型同样适用于equals,toString,compare等方法

3. Character类型

    Character类型比较特别,这是因为它对应的是char,而不是数值。

    先看看以下代码

        Character c1=new Character(‘a‘);//标准转换
        Character c2=‘b‘;//自动装箱
        char[] cs={‘q‘,‘w‘,‘e‘};
        System.out.println(c1.charValue());
        System.out.println(c1.compareTo(c2));
        System.out.println(c1.equals(c2));
        System.out.println(c1.toString());
        System.out.println(Character.codePointAt(cs, 1));
        System.out.println(Character.isAlphabetic(0x4400));
        System.out.println(Character.isDigit(c1));
        System.out.println(Character.isLowerCase(c2));

得到结果

a
-1
false
a
119
true
false
true

 要弄懂Character类型,首先要弄懂代码点codepoint和代码单元的区别。

   简单的说,代码点对应的是真正字符的unicode编码,大部分是一个代码单元,但是也可能是两个代码单元。

   一个代码单元就是两个字节,两个代码单元就是四个字节.

   在System.out.println(Character.isAlphabetic(0x4400));里面,0x4400就是代码点,它代表了一个普通的Alpha。

   那些不普通的字符,就是辅助字符,需要占据两个代码单元,那应该怎么区别是普通字符还是辅助字符呢,

   需要使用Character.isSupplementaryCodePoint(codePoint)方法去判断。

   在这个地方我不就不详细解释了,等解释String类时候,会详细介绍String,Character,char之间错综复杂的关系。

 

Java:对象包装类

原文:http://www.cnblogs.com/wxfshine/p/6415895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!