Java包装类、拆箱和装箱详解

    |     2015年4月1日   |   Java面向对象   |     0 条评论   |    1664

Java 是面向对象语言,但八种基本类型并不带对象特性:没有属性、也不能调方法。保留它们是为了符合习惯,并让常规数值运算更简单高效。

引用类型都继承了 Object,转成字符串只要调 toString();基本类型就麻烦得多。为此 Java 给每种基本类型配了一个类,叫做包装类(Wrapper Classes),也有教材称为外覆类或数据类型类。

每个包装类对象封装一个对应的基本类型值,并提供一些有用方法。对象一经创建,所封装的值不可改变(不可变)。基本类型转到包装类叫装箱,反过来叫拆箱。

基本类型 包装类 拆箱方法
byte Byte byteValue()
short Short shortValue()
int Integer intValue()
long Long longValue()
float Float floatValue()
double Double doubleValue()
char Character charValue()
boolean Boolean booleanValue()

一、手动装箱与拆箱

八个包装类用法相近。以 Integer 为例:历史上可用构造方法把 int 装箱,用 intValue() 拆箱。Java 9 起这些构造方法已过时,推荐 Integer.valueOf(m)。

public class Demo {
    public static void main(String[] args) {
        int m = 500;
        Integer obj = Integer.valueOf(m);  // 手动装箱
        int n = obj.intValue();            // 手动拆箱
        System.out.println("n = " + n);

        Integer obj1 = Integer.valueOf(500);
        System.out.println("obj 等价于 obj1?" + obj.equals(obj1));
    }
}

运行结果:n = 500;obj 等价于 obj1?true。比较包装对象的值要用 equals,不要依赖 ==(缓存范围外会是不同对象)。

二、字符串与整数互转

Integer 有静态方法 parseInt(String s, int radix):s 是要转换的字符串,radix 是进制,可省略,默认十进制。字符串必须整段都是合法数字,否则抛异常。

public class Demo {
    public static void main(String[] args) {
        String str[] = {"123", "123abc", "abc123", "abcxyz"};
        for (String str1 : str) {
            try {
                int m = Integer.parseInt(str1, 10);
                System.out.println(str1 + " 可以转换为整数 " + m);
            } catch (Exception e) {
                System.out.println(str1 + " 无法转换为整数");
            }
        }
    }
}

运行结果:只有 123 能转;后面三个都无法转换。整数转字符串用静态 Integer.toString(m),也可以 String.valueOf(m)。

int m = 500;
String s = Integer.toString(m);
System.out.println("s = " + s);

运行结果:s = 500。

三、自动装箱和拆箱

上面都是手动实例化包装类。Java 5 之前必须手动拆装箱;Java 5 起可以自动进行:把 int 赋给 Integer 会装箱,把 Integer 赋给 int 会拆箱。

public class Demo {
    public static void main(String[] args) {
        int m = 500;
        Integer obj = m;  // 自动装箱,相当于 Integer.valueOf(m)
        int n = obj;      // 自动拆箱,相当于 obj.intValue()
        System.out.println("n = " + n);

        Integer obj1 = 500;
        System.out.println("obj 等价于 obj1?" + obj.equals(obj1));
    }
}

运行结果同样是 n = 500,以及 equals 为 true。自动拆装箱是日常写法,但包装类型为 null 时拆箱会抛空指针,需要留意。

一句话总结:包装类把八种基本类型变成对象;基本类型进对象叫装箱,出来叫拆箱,Java 5 起可以自动做。

转载请注明来源:Java包装类、拆箱和装箱详解
本文链接地址:https://ai.zhousir.top/?p=117
回复 取消