基本实现
为什么会有包装类
java是一门面向对象的语言,一切皆是对象。但是像int这种基本类型不是对象,而我们有时候需要将int转换成对象,所以就有了包装类的概念,每个基本类型都有个一个对应的包装类。
对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。
同时, 对象包装器类还是 final , 因此不能定义它们的子类
----来自java核心技术卷1(第十版)
byte | int | short | long | char | void | boolean | float | double |
---|---|---|---|---|---|---|---|---|
Byte | Integer | Short | Long | Character | Void | Boolean | Float | Double |
自动装箱与自动拆箱
自动装箱
当我们使用列表是,我们定义一个整数数组列表,执行添加操作
//<>不能是基本类型,所以采用Integer --> 这也是包装类的用途之一
List<Integer> list = new ArrayList<>();
list.add(1);
我们进行反编译可以看到
其实我们进行的
list.add(1)
是
list.add(Integer.valueOf(1))
这就是自动装箱
自动拆箱
还是以一个例子来说,让我们思考一下执行下面这行代码的过程是怎么样呢?
int n = list.get(1)
还是进行反编译来看一看
可以看到我们执行的其实是
int n = list.get(1).intValue()
这就是自动拆箱
小知识点🌟
装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时, 插人必要的方法调用。虚拟机只是执行这些字节码。
小例子
1. 关于包装类的计算
Byte a = 1;
Byte b = 2;
int c = a + b;
反编译
可以看出我们在赋值的时候,进行了自动装箱,然后进行加法计算时进行了自动拆箱
这里还有一个小知识点🌟
精度小于int的类型,在进行加法是会转换成int进行计算
2.判相等
让我们来猜一下输出结果
int a = 1;
int b = 100;
Integer a1 = 1;
Integer b1 = 100;
Integer a2 = new Integer(1);
Integer b2 = new Integer(100);
System.out.println(a == a1);
System.out.println(a == a2);
System.out.println(a1 == a2);
System.out.println(b == b1);
System.out.println(b == b2);
System.out.println(b1 == b2);
输出结果为
解释:
前两个是true是因为自动拆箱,在判相等时都拆成了基本类型进行比较,所以是true
而最后一个false是因为 “==”判断的是值,而Integer a1 = 1;是值引用,赋的是值,进行new操作是对象引用,赋的是地址