装箱和拆箱
装箱:把基本数据类型转换为包装类对象,为了使用专门为对象设计的API和特性
拆箱:把包装类对象转为基本数据类型,一般是因为需要运算,Java中的大多数运算符是为基本数据类型设计的。比较、算术等
包装类
基本数据类型的变量不是对象. 为了满足万物皆对象的理念,就需要对基本数据类型的变量进行打包封装处理变成对象
基本类型 | 长度 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
byte | 1个字节(8位) | 0 | Byte | |
short | 2字节 | [-215,215-1] | 0 | Short |
int | 4字节 | [-231,231-1] | 0 | Integer |
long | 8字节 | [-263,263-1] | 0 | Long |
boolean | 理论1位实际1个字节 | false | Boolean | |
char | 2字节 | \u0000 | Character | |
float | 4字节 | 0.0 | Float | |
double | 8字节 | 0.0 | Double |
自动装箱和拆箱(编译阶段)
package com.walker.box;
public class BoxTest {
public static void main(String[] args) {
int i = 10;
Integer m = 100;
int n = m;
}
}
> javap -c .\BoxTest.class
Compiled from "BoxTest.java"
public class com.walker.box.BoxTest {
public com.walker.box.BoxTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: bipush 100
5: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: astore_2
9: aload_2
10: invokevirtual #3 // Method java/lang/Integer.intValue:()I
13: istore_3
14: return
}
查看字节码文件
- 装箱时调用Integer.valueof方法
- 拆箱调用Integer.intValue方法
说明
- 当包装类型跟基本类型进行比较,或者计算的时候,都会进行拆箱为基本类型(Integer-> int)
- 如果 两个都是包装类型,如:Integer,那么会直接比较。但是判断相等不建议使用“==”,建议使用equals
- 但凡涉及到算术运算的时候,都会进行自动拆箱
- 如果是equals,那就都是引用类型。会自动装箱
- 基本数据类型不是面向对象的