对象包装类的背景:
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 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之间错综复杂的关系。
原文:http://www.cnblogs.com/wxfshine/p/6415895.html