包装类及自动装箱/拆箱
包装类是将Java中的八种基本数据类型封装成的类,所有数据类型都能很方便地与对应的包装类相互转换,以解决应用中要求使用数据类型,而不能使用基本数据类型的情况。
int a = 10; //基本类型的数据
Integer b = new Integer(10); //包装类表示的数据
包装类的特点
- 所有包装类都是final类型(不能派生子类);
 - 实例化包装类对象后,对象中保存的基本类型数据不能再改变;
 - 包装类封装大量有用的方法(如数据类型转换、判断大小写、最大值、最小值等);
 - 除Character类和Boolean类继承于Object类,其他的包装类都继承于Number类。
 
基本数据类型和包装类
| 基本数据类型 | 包装类 | 
|---|---|
| boolean | Boolean类 | 
| byte | Byte类 | 
| short | Short类 | 
| int | Integer类 | 
| long | Long类 | 
| char | Charactor类 | 
| float | Float类 | 
| double | Double类 | 
包装类的共同点
- 包装类中包含的值不改变( 包装类实例化后不能修改保存的值 );
 - 包装类有两个构造器
- Integer(int value) —指定int值的构造对象
 - Integer(String s) —指定String值的构造对象
 
 - 包装类中都有xxxValue()方法
- int intValue() —返回包装类对象的int值
 - float floatValue() —返回包装类对象的float值
 
 - 包装类中都有两个ValueOf()方法
- static Integer valueOf(int i) —指定int值的Integer实例
 - static Integer valueOf(String s) —指定String值的Integer实例
 
 
自动装箱和拆箱
自动装箱和自动拆箱是基本数据类型与包装类之间的转换机制(通过编译器自动完成)
基本数据类型 —自动装箱—>包装类;
包装类 —自动拆箱 —>基本数据类型。
例:以int类型和Integer类型为例
public class Test01 {
    public static void mAIn(String[] args) {
        // 自动装箱 int -> Integer
        int i = 10;
        Integer integer1 = i;
        System.out.println(integer1);
        //自动拆箱 Integer -> int
        int j = 20;
        Integer integer2=j;
        int k = integer2;
        System.out.println(j);
    }
}
包装类型和String类型的相互转换
例:以 Integer 和 String 为例
public class Test03 {
    public static void main(String[] args) {
        //包装类Integer -> String
        Integer i = 100; //自动装箱
        //方式1
        String str1 = i+"";
        //方式2 调用Integer的toString()方法
        String str2 = i.toString();
        //方式3 调用静态方法String.valueOf()
        String str3 =String.valueOf(i);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        //String -> 包装类Integer
        String str4 = "123";
        //方式1 调用包装类的parseXXX()方法
        Integer i2 = Integer.parseInt(str4);//自动拆箱
        //方式2
        Integer i3 = new Integer(str4); //构造器
        System.out.println(i2);
        System.out.println(i3);
    }
}
例题1:
以下两个题目输出结果相同吗?为什么?
Object obj1 = true?new Integer(1):new Double(2.0); //三元运算符(是一个整体)
System.out.println(obj1);
//运行结果 
// 三元运算符是一个整体,精度最高的是double,所以结果是1.0
1.0
Object obj2;
if(true){
    obj2 = new Integer(1);
}else{
    obj2 = new Double(2.0);
}
System.out.println(obj2);
//运行结果
//if、else是分别独立的语句,是什么输出什么
1
例题2(Integer类):
public class Test04 {
    public static void main(String[] args) {
        Integer i1 = new Integer(10);
        Integer i2 = new Integer(10);
        System.out.println(i1 == i2); // false (判断i1和i2是否指向同一个对象)
        System.out.println(i1.equals(i2)); // true
        Integer j1 = 20; //底层 Integer.valueOf(20) {-128~127}直接返回对象引用,否则创建新的对象new Integer()
        Integer j2 = 20; //底层 Integer.valueOf(20)
        System.out.println(j1 == j2); // true
        Integer k1 = 128; //超出{-128~127}范围,创建新的对象new Integer()
        Integer k2 = 128;
        System.out.println(k1 == k2); // false (判断k1和k2是否指向同一个对象)
    }
}
例题3(Integer):
public class Test05 {
    public static void main(String[] args) {
        Integer i1 = new Integer(127);
        Integer i2 = new Integer(127);
        System.out.println(i1 == i2); // false i1和i2是两个不同的对象
        Integer i3 = new Integer(128);
        Integer i4 = new Integer(128);
        System.out.println(i3 == i4); // false  i3和i4是两个不同的对象
        Integer i5 = 127;  //底层Integer.valueOf(127)
        Integer i6 = 127;
        System.out.println(i5 == i6); // true
        Integer i7 = 128;  //底层new Integer(128)
        Integer i8 = 128;
        System.out.println(i7 == i8); // false 同i3和i4
        Integer i9 = 127;
        Integer i10 = new Integer(127);
        System.out.println(i9 == i10); // false
        int a1 = 127;
        Integer b1 = 127;
        System.out.println(a1 == b1); // true  只要有基本数据类型,判断的是值是否相等,不管是int还是Integer
        int a2 = 128;
        Integer b2 = 128;
        System.out.println(a2 == b2); // true 同上
    }
}
很多知识来源于韩顺平Java课程,讲的非常好,非常详细,感兴趣的同学可以去学习。
如有错误,请大家批评指正,共同进步。
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
		
评论(0)