为什么有包装类?
在Java中,基本数据类型不是继承自Object,为了在泛型中可以支持基本数据类型,Java给每个基本数据类型都对应了一个包装类。【基本数据类型不符合面向对象思想,基本类型不是对象,从而基本数据类型都可以面向对象编程】
基本数据类型和对应的包装类
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| char | Character |
| double | Double |
| float | Float |
| boolean | Boolean |
除了int和char对应的包装类Integer、Character,其余基本类型的包装类都是首字母大写。
int a = 10;Integer i = a;Integer j = (Integer)a;System.out.println(i);System.out.println(j);}
字节码文件:
分析:自动装箱是在编译Integer i = a时会自动调用装箱方法Integer.valueOf(a)
②自动拆箱(包装类型变为对应的基本数据类型)
public static void main(String[] args) {Integer i = 10;int a = i;int k = (int)i;System.out.println(a);System.out.println(k);}
字节码文件:

分析:自动拆箱是在编译int b = i 时会自动调用拆箱方法i.intValue()
public static void main(String[] args) {int i = 10;Integer j = Integer.valueOf(i);Integer k = new Integer(i);int m = j.intValue();}
public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);
}
输出:true false
分析:此处涉及到自动装箱,因此底层会调用valueOf方法
可以发现valueOf方法有2个返回值
第一个返回值:low为-128,high为127,即传入的i值在-128到127之间会直接在cache缓存数组中返回数组元素下标值。
i+(-(-128)) = i + 128; i取-128时,下标值为0;i取127时,下标值为256。
缓存数组:

第二个返回值:不在if判断语句low和high的范围内,就会实例化新的对象。
因此:
当值为127的时候,并没有new包装类对象,而是直接从数组的同一个下标中取值。
当值为128的时候,new的包装类对象,则此时==号比较的时两个对象的地址。
下一篇:泉水怎么造句