-
为什么有包装类?
在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()
- 手动装箱和拆箱
①手动装箱的两种方法【调用valueOf方法,new包装类对象】
②手动拆箱的方法【调用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的包装类对象,则此时==号比较的时两个对象的地址。