Java教程-Java 中的 Wrapper 类

Java中的包装类(Wrapper class)提供了将基本类型转换为对象以及将对象转换为基本类型的机制。
自从J2SE 5.0版本开始,自动装箱(Autoboxing)和拆箱(Unboxing)功能使得基本类型自动转换为对象,并且对象自动转换为基本类型。将原始类型值转换为对应包装类对象的自动转换称为自动装箱,反之则称为拆箱。
在Java中使用包装类的场景
Java是一种面向对象的编程语言,因此在许多情况下需要处理对象,例如集合、序列化、同步等。下面是一些需要使用包装类的不同场景:
- 修改方法中的值: Java只支持按值传递,因此如果我们传递一个原始值,它不会改变原始值。但是,如果我们将原始值封装为对象,那么对该对象的修改将影响原始值。
- 序列化: 在执行序列化时,我们需要将对象转换为流。如果我们有一个原始值,可以通过包装类将其转换为对象。
- 同步: Java的同步机制与多线程中的对象一起工作。为了在多线程环境下使用原始类型,我们可以使用包装类来实现同步。
- java.util包: java.util包提供了许多实用的类来处理对象。
- 集合框架: Java的集合框架只能处理对象。集合框架中的所有类(如ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、PriorityQueue、ArrayDeque等)都只处理对象。
java.lang包的八个类在 Java 中称为包装类。八个包装类的列表如下:
原始类型 | Wrapper 类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
自动装箱
将原始数据类型自动转换为其对应的包装类称为自动装箱,例如将byte转换为Byte、char转换为Character、int转换为Integer、long转换为Long、float转换为Float、boolean转换为Boolean、double转换为Double、short转换为Short。
自从Java 5版本开始,我们不再需要使用包装类的valueOf()方法来将原始类型转换为对象,编译器会自动执行这个转换。
包装器类示例:原始到包装器
//Java 程序将原语转换为对象
//int 到 Integer 的自动装箱示例
public class WrapperExample1{
public static void main(String args[]){
//将int转换为整数
int a=20;
Integer i=Integer.valueOf(a);//显式地将 int 转换为 Integer
Integer j=a;//自动装箱,现在编译器将在内部写入 Integer.valueOf(a)
System.out.println(a+" "+i+" "+j);
}}
输出:
20 20 20
开箱
将包装器类型自动转换为其相应的原始类型称为拆箱。这是自动装箱的逆过程。
//将对象转换为基元的Java程序
//Integer 到 int 的拆箱示例
public class WrapperExample2{
public static void main(String args[]){
//整数转int
Integer a=new Integer(3);
int i=a.intValue();//显式地将 Integer 转换为 int
int j=a;//拆箱,现在编译器将在内部编写 a.intValue()
System.out.println(a+" "+i+" "+j);
}}
输出:
3 3 3
Java Wrapper 类示例
public class WrapperExample3{
public static void main(String args[]){
byte b=10;
short s=20;
int i=30;
long l=40;
float f=50.0F;
double d=60.0D;
char c='a';
boolean b2=true;
//自动装箱:将基元转换为对象
Byte byteobj=b;
Short shortobj=s;
Integer intobj=i;
Long longobj=l;
Float floatobj=f;
Double doubleobj=d;
Character charobj=c;
Boolean boolobj=b2;
//打印对象
System.out.println("---Printing object values---");
System.out.println("Byte object: "+byteobj);
System.out.println("Short object: "+shortobj);
System.out.println("Integer object: "+intobj);
System.out.println("Long object: "+longobj);
System.out.println("Float object: "+floatobj);
System.out.println("Double object: "+doubleobj);
System.out.println("Character object: "+charobj);
System.out.println("Boolean object: "+boolobj);
//拆箱:将对象转换为基元
byte bytevalue=byteobj;
short shortvalue=shortobj;
int intvalue=intobj;
long longvalue=longobj;
float floatvalue=floatobj;
double doublevalue=doubleobj;
char charvalue=charobj;
boolean boolvalue=boolobj;
//打印原语
System.out.println("---Printing primitive values---");
System.out.println("byte value: "+bytevalue);
System.out.println("short value: "+shortvalue);
System.out.println("int value: "+intvalue);
System.out.println("long value: "+longvalue);
System.out.println("float value: "+floatvalue);
System.out.println("double value: "+doublevalue);
System.out.println("char value: "+charvalue);
System.out.println("boolean value: "+boolvalue);
}}
输出:
---Printing object values---
Byte object: 10
Short object: 20
Integer object: 30
Long object: 40
Float object: 50.0
Double object: 60.0
Character object: a
Boolean object: true
---Printing primitive values---
byte value: 10
short value: 20
int value: 30
long value: 40
float value: 50.0
double value: 60.0
char value: a
boolean value: true
Java 中的自定义 Wrapper 类
Java Wrapper 类包装了原始数据类型,这就是它被称为包装类的原因。我们还可以创建一个包装原始数据类型的类。因此,我们可以在 Java 中创建自定义包装器类。
//创建自定义包装类
class Javatpoint{
private int i;
Javatpoint(){}
Javatpoint(int i){
this.i=i;
}
public int getValue(){
return i;
}
public void setValue(int i){
this.i=i;
}
@Override
public String toString() {
return Integer.toString(i);
}
}
//测试自定义包装类
public class TestJavatpoint{
public static void main(String[] args){
Javatpoint j=new Javatpoint(10);
System.out.println(j);
}}
输出:
10