课时85:装箱与拆箱
摘要:
1.装箱与拆箱操作的定义
2.范例
01. 装箱与拆箱操作的定义
装箱与拆箱操作,基本数据类型的包装类都是为了基本数据类型转为对象提供的,这样对于基本类型与包装类型就有了如下的操作关系。
1.1数据装箱:
将基本数据类型保存到包装类之中,一般可以利用构造方法完成。
-Integer 类:public Integer(int value);
-Double 类:public Double(double value);
-Boolean 类:public Boolean(boolean value);
基本类型中其他的方法。
Constructors 是构造方法。
1.2数据拆箱:
从包装类中获取基本数据类型
数值型包装类已经由 Number 类定义了拆箱的方法了;
Boolean 型: public boolean booleanvalue0;
范例:以 Int 和 Integer 为例,现在所处在版本交替的振动期。
Public class JavaDemo{ Public static void main(string args[]){ Integer obj=new Integer(10);//装箱 int num = obj.intValue();//拆箱 System.out.println(num * num); } }
跟之前看到的代码不一样,从自定义类变为系统提供类。如果出现Depression,可以通过压制警告来避免。
Depression 并不会影响正常使用。
02. 范例
2.1以 Double 与 Double 为例
Public class JavaDemo{ Public static void main(string args[]){ double obj=new double (10.1);//装箱 int num = obj.doubleValue();//拆箱 System.out.println(num * num); } }
Bug一直存在,无需关注。
2.2以 Boolean 与 Boolean 为例
就介绍几种常见的类型,其他包装类相对较少出现。
Public class JavaDemo{ Public static void main(string args[]){ boolean obj=new boolean (true);//装箱 boolean num = obj.booleanValue();//拆箱 System.out.println(num); } }
这些过期操作在1.9版本之前是不存在的,目前处于一个过渡阶段,1.8版本仍被鼓励使用。可以发现从 JDK1.9 之后,对于所有包装类之中提供的构造方法就变为了过期处理不建议用户继续使用,这是因为在 JDK 1.5 之后的版本中,为了简化处理流程已经提供了自动装箱和拆箱的操作,手工维护模式基本不再使用。
但直到 1.9 版本之后,才被视为过时,这是因为系统已计算好时间,大多数旧系统不再更新到 1.9 版本。当年编写代码时并没有自动模式,因此操作相当耗时,需要不断地拆装和组装,非常麻烦。
2.3观察自动装箱与拆箱
public class JavaDemo{ public static void main(string args[]){ Integer obj=10;//自动装箱,此时不再关心构造方法了 Int num=obj;//自动拆箱 obj++;//包装类对象可以直接参与数学运算 System.out.println(num*obj);//直接参与数学运算 } }
没有警告,程序再次执行,实现自动增长和数学计算。通过这一段代码发现现在能够自动进行装箱和拆箱,以后就可以直接通过对象来处理。除了提供有这种自动的数学运算支持之外,使用自动装箱最大的好处是可以实现 Obiect 接收基本数据类型的操作。
范例:Obiect 接收小数
public class JavaDemo{ public static void main(string args[]){ Object obj=19.2;//double自动包装箱为 double ,向上转型 为 object Obj ++; } }
19.2 是一个基本数据类型,是object的子类型。原本类与类之间不能直接转换。
执行后 Object 类不支持,包装类才支持,Number 类是包装类的子类。Object 类型不能直接转换为基本类型。只能先变成 Double 。
public class JavaDemo{ public static void main(string args[]){ Object obj=19.2;//double自动包装箱为 double ,向上转型 为 object Double num =(double) obj;//向下转型为包装类,再自动拆箱时执行 System.out.println(num*2); } }
这些步骤实现了自动装箱和拆箱的功能。可以看到从 JDK 1.5 开始,Java 提供了一种自动支持的功能,到了 JDK 1.9为了巩固概念,将包装类的构造方法都设置为过期定义。但是对于包装类需要注意一些问题了,关于相等判断上。
范例:观察相等判断
public class JavaDemo{ public static void main(string args[]){ Integerx=99; Integery=99; System.out.println(x==y);//ture } }
public class JavaDemo{ public static void main(string args[]){ Integerx=127; Integery=127; System.out.println(x==y);//ture } }
public class JavaDemo{ public static void main(string args[]){ Integerx=128; Integery=128; System.out.println(x==y);//false } }
public class JavaDemo{ public static void main(string args[]){ Integerx=-128; Integery=-128; System.out.println(x==y);//false } }
public class JavaDemo{ public static void main(string args[]){ Integerx=-129; Integery=-129; System.out.println(x==y);//false } }
范围的概念,负 128 到正 127 正好Byte的范围,而超过 127 之后==没用,占两类,在这种情况下,所有类都是 Object 子类,所有类都支持。
public class JavaDemo{ public static void main(string args[]){ Integerx=128; Integery=128; System.out.println(x==y);//false System.out.println(x.equals(y));//true } }
以后 进行包装类的相等判断时,必须使用 Equals() 方法。而包装类本身也需要考虑占位的长度,如果超过了一位的内容,那么就需要使用 Equals() 比较,如果不超过了则使用'“==”即可判断。
public class JavaDemo{ public static void main(string args[]){ Integerx=127; Integery=new integer(127); System.out.println(x==y);//false System.out.println(x.equals(y));//true } }
等等比较的是False,跟 Integer 相同。因此通过取消构造方法,Java 编程可以避免一些复杂的概念。这正是自动装箱与拆箱功能的重要之处,将来不要再使用自动构造方法,毕竟是系统提供的包装类。