Lớp Wrapper trong java cung cấp cơ chế để chuyển đổi kiểu dữ liệu nguyên thủy thành kiểu đối tượng và từ đối tượng thành kiểu dữ liệu nguyên thủy.
Tính năng autoboxing
và unboxing
chuyển đổi kiểu dữ liệu nguyên thủy thành kiểu đối tượng và từ đối tượng thành kiểu dữ liệu nguyên thủy một cách tự động từ J2SE 5.0. Sự chuyển đổi tự động kiểu dữ liệu nguyên thủy thành kiểu đối tượng được gọi là autoboxing
và ngược lại được gọi là unboxing
.
Các lớp bao kiểu nguyên thủy (Wrapper class)
Các giá trị nguyên thủy không phải là đối tượng trong Java. Để có thể thao tác được trên các giá trị nguyên thủy (giá trị số, kí tự và logic) thì gói java.lang cung cấp các lớp bao gói (Wrapper) cho từng kiểu dữ liệu nguyên thủy (gọi tắt là lớp bao). Có 8 lớp Wrapper chúng được thiết kế trong gói java.lang
như sau
Kiểu nguyên thủy | Kiểu Wrapper |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
public class Thaycacac {
public static void main(String args[]) {
// Đổi int thành Integer
int a = 2;
Integer i = Integer.valueOf(a);// đổi int thành Integer
Integer j = a;// autoboxing, tự động đổi int thành Integer trong nội bộ trình biên dịch
System.out.println(a + " " + i + " " + j);
}
}
2 2 2
public class Thaycacac {
public static void main(String args[]) {
// đổi Integer thành int
Integer a = new Integer(9);
int i = a.intValue();// đổi Integer thành int
int j = a;// unboxing, tự động đổi Integer thành int trong nội bộ trình biên dịch
System.out.println(a + " " + i + " " + j);
}
}
9 9 9
Các đặc điểm của lớp Wrapper trong Java
Khởi tạo
Các lớp bao (trừ lớp Character chỉ có một cách khởi tạo) đều có hai cách khởi tạo:
- Các thứ nhất là sử dụng giá trị nguyên thủy để tạo ra đối tượng tương ứng
Character charObj = new Character('a');
Boolean boolObj = new Boolean(true);
Integer intObj = new Integer(2002);
Float floatObj = new Float(3.14F);
Double doubleObj = new Double(3.14);
- Cách thứ 2 là chuyển thành String biểu diễn cho các giá trị nguyên thủy về các lớp tương ứng. Các toán tử này sẽ ném ra ngoại lệ
NumberFormatException
khi giá trị String truyền vào hàm tạo không hợp lệ.
Boolean boolObj = new Boolean("true");
Integer intObj = new Integer("2002");
Float floatObj = new Float("3.14F");
Double doubleObj= new Double("3.14");
valueOf(String s)
, toString()
, typeValue()
, equals()
Có các hàm chung: - Mỗi lớp (trừ lớp Character) đều định nghĩa hàm static
valueOf(String s)
trả lại đối tượng tương ứng
Các hàm này ném ra ngoại lệ NumberFormatException
khi giá trị String truyền vào phương thức không hợp lệ.
Boolean boolObj = Boolean.valueOf("true");
Integer intObj = Integer.valueOf("2002");
Float floatObj = Float.valueOf("3.14F");
Double doubleObj= Double.valueOf("3.14");
- Các lớp viết đè hàm
toString()
trả lại là các đối tượng String biểu diễn cho các giá trị nguyên thủy ở dạng chuỗi
String charStr = charObj.toString(); // "a"
String boolStr = boolObj.toString(); // "true"
String intStr = intObj.toString(); // "2002"
String doubleStr = doubleObj.toString(); // "3.14"
- Các lớp định nghĩa hàm
typeValue()
trả lại các giá trị nguyên thủy tương ứng với các đối tượng nguyên thủy
boolean b = boolObj.booleanValue(); // true
int i = intObj.intValue(); // 2002
float f = floatObj.floatValueOf(); // 3.14F
double d = doubleObj.doubleValueOf(); // 3.14
char c = charObj.charValue(); // 'a'
- Các lớp viết đè hàm
equals()
để thực hiện so sánh bằng nhau của các đối tượng nguyên thủy
Character charObj = new Character('a');
boolean charTest = charObj.equals('b'); // false
Integer intObj1 = Integer.valueOf("2010");
boolean intTest = intObj.equals(intObj1); // false