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 类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

自动装箱

将原始数据类型自动转换为其对应的包装类称为自动装箱,例如将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

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想