Java自动装箱和自动拆箱机制小究
很早就听说过java的自动装箱和自动拆箱机制了,是在我学习基本数据类型的时候。
八种基本数据类型————byte、short、int、long、float、double、char、boolean
以上八种数据类型他们不是类,他们为什么不是类,不是类怎么在java中存在的,我也不知道。
每一种基本数据类型都有一个封装类,如表:
| 基本数据类型 | 封装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
下面回顾一下什么是类,类是具有相同属性和行为的抽象?就是说同一个类的对象他们都有相同属性和行为,在类中我们叫做成员对象和成员方法。其中成员对象又分为实例对象和类对象,成员方法也是,分为成员方法和类方法。
为什么要回顾什么是类?因为我曾经被封装两个字吓破了胆子。现在也一样。我想要知道为什么要用这么高级的词汇来形容,明明就是写了一个类,比如Integer类,他的构造方法就是:
参数是int整数
点击查看代码
public Integer(int value){
this.value = value;
}
点击查看代码
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}
点击查看代码
int a = 12;
Integer b = new Integer(a);
或者
String s = "H";
Integer c = new Integer(s);
为什么要使用封装类,直接使用基本数据类型不就好了吗?额,我只能说说我的见识了,使用封装类后,一切变麻烦了,我需要使用new创建对象,还要去记忆对象使用的各种方法。
对于创建对象,我是不敏感的,而对于需要记忆对象的方法,我也很苦恼。为什么要去记忆这些方法呢,怎么记忆呢?
Integer类的开门红方法
点击查看代码
public static String toString(int i, int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) //Character.MIN_RADIX==2,Character.MAX_RADIX==36
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
if (!negative) {
i = -i;
}
while (i <= -radix) {
buf[charPos--] = digits[-(i % radix)];
i = i / radix;
}
buf[charPos] = digits[-i];
if (negative) {
buf[--charPos] = '-';
}
return new String(buf, charPos, (33 - charPos));
}
点击查看代码
public static String toString(int i) {
if (i == Integer.MIN_VALUE) //-2147483648
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
点击查看代码
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
看不下去了,直接说吧,在Integer类中有两个个方法将int值转换成String对象的。
public static String toString(int i)
public static String toString(int i, int radix)
第二个没看懂,第一个也没看懂。不过,java是一门工科,实践出真知,掏出eclipse,输入:System.out.println(Integer.toString(23));,于是打印出23,第二个方法怎么实践都没有规律,原因自己去看源代码。
打印出来的23,也就是你在console中看到的23其实已不是那个int,而是变成了一个String对象被打印出来了。额,如果没有这个封装类Integer,是不是我们要自己想办法把int对象变成String对象然后才能打印出来呢?而很多方法的扩展在Integer类中早就已经写好了,就等着你去使用了。
直到使用到这些方法,额,杂乱的使用。每次使用的要百度这些方法,比如,如何将String对象转换成Integer对象,如何将int转换成String对象……
说回正题,我们为什么非得使用这些封装类而不直接使用基本数据类型?
泛型
这也是封装类的一个好用处啊。什么是泛型,在我的理解就是参数变量化,原来方法中的参数需要指定好类型或者没有参数,可以使用< T >来表示参数,在调用方法时指定具体的方法就好了,那这样说不是static方法不能使用泛型?
比如Map的构造方法是 HashMap< T >();
创建对象的方法就是HashMap<Integer> map = new HashMap<Integer>();
扩展了方法
上面说了的,粉装类扩展了基本数据类型的使用范围。
如果没有这些封装类,你要如何把int值转换成String对象?不可思议,什么情况下需要使用到这样的情况呢?将int值转换成String对象
下面说说自动装箱和自动拆箱机制:
自动装箱:java自动地把基本数据类型转换成对应封装类对象
自动拆箱:java自动地把封装类对象转换成对应基本数据类型
从此java中基本数据类型和其封装类对象就可以自由地赋值了。
如果你说,那int如何转换成char呢?
这不是可以使用强制类型转换吗?高精度转换成低精度,强制类型转换。
int a = 3;
char c = (char)a;
好了,到此为止把。自动装箱和拆箱就讲到这里。
下面是Integer类中的几个方法:
static Character valueOf():将基本数据类型转换成封装对象
XXX XXXValue():将包装类对象转换成基本数据类型
(static) String toString():转换成字符串对象
static int parseInt(String s):将字符串对象转换成int
本来是越来越顺才对,怎么感觉我越讲越糊涂了,哈哈,再见!
浙公网安备 33010602011771号