1. Danh sách các loại trình bao bọc

Bạn biết rằng Java có 8 kiểu nguyên thủy, đó là những kiểu không phải là lớp. Một mặt, điều này là tốt — chúng đơn giản và chiếm ít không gian. Mặt khác, đôi khi các lớp học chính là thứ chúng ta cần. Bạn sẽ tìm ra chính xác lý do tại sao lại như vậy trong bài học tiếp theo.

Vậy thì cái gì có thể làm được?

Bắt đầu với phiên bản thứ năm của Java, mỗi kiểu nguyên thủy có được một lớp kép. Mỗi lớp như vậy lưu trữ một trường duy nhất với giá trị của một loại cụ thể. Các lớp này được gọi là các loại trình bao bọc , bởi vì chúng bao bọc các giá trị nguyên thủy trong các lớp.

Dưới đây là danh sách các loại này. Bạn có biết bất kỳ?

loại nguyên thủy lớp bao bọc
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

Tên của các kiểu nguyên thủy bắt đầu bằng một chữ cái viết thường, nhưng tên của các lớp bao bọc bắt đầu bằng một chữ cái viết hoa. Một số tên lớp cũng dài hơn một chút: Integerinstead of intи Characterinstead of char.

Tất cả các đối tượng của các lớp bao bọc là không thể thay đổi ( không thay đổi ).

Mã đơn giản hóa cho Integerlớp trông giống như thế này:

Mã số Ghi chú
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}




Hàm tạo biến




Phương thức trả về một giá trị




Phương thức tĩnh tạo một Integerđối tượng mới cho một intbiến

2. Chuyển đổi an intthành anInteger

Các kiểu trình bao bọc được coi là đối trọng với các anh chị em nguyên thủy của chúng: bạn có thể dễ dàng tạo một đối tượng trình bao bọc tương ứng với một kiểu nguyên thủy.

Hãy sử dụng kiểu int làm ví dụ để phân tích cách các kiểu nguyên thủy tương tác với các kiểu trình bao bọc tương ứng của chúng. Mã để chuyển đổi từ an intsang an Integervà ngược lại sẽ như sau:

Để chuyển đổi an intthành an Integer, bạn cần viết mã này:

Integer name = new Integer(value);

Đâu namelà tên của một Integerbiến và valueintgiá trị được bao bọc.

Ví dụ:

Mã số Ghi chú
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

Và để chuyển đổi an Integerthành an int, bạn cần viết mã này:

int name = variable.intValue();

Đâu namelà tên của một intbiến và variablelà một tham chiếu đến một Integerđối tượng.

Ví dụ:

Mã số Ghi chú
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. Tự động đóng hộp và mở hộp

Nhưng ngay cả những thao tác đơn giản với Integerkiểu cũng không dễ viết.

Như chúng tôi đã nói trước đây, Integerloại là không thể thay đổi ( immutable ). Để tạo một Integerđối tượng có giá trị mới int, bạn cần tạo một Integerđối tượng mới một cách rõ ràng. Điều đó nói rằng, thật dễ dàng để lấy giá trị của một đối tượng intđược lưu trữ bên trong một Integerđối tượng — chỉ cần gọi intValue()phương thức.

Ví dụ:

Mã số Sự miêu tả
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Bao bọc 5đối Integertượng
Lấy giá trị từ Integerđối tượng
Tạo Integerđối tượng mới (bằng 10)

Đây là mã khá rườm rà, bạn có nghĩ vậy không?

Những người tạo ra Java đã nghĩ như vậy, vì vậy họ đã dạy trình biên dịch cách thực hiện các thao tác này một cách tự động. Việc chuyển đổi tự động của một intthành một Integerđược gọi là autoboxing (tự động đặt giá trị vào một hộp) và hoạt động ngược lại (chuyển đổi một Integerthành một int) được gọi là unboxing .

Ma cua ban Những gì trình biên dịch nhìn thấy
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

Nhờ autoboxing và unboxing, bạn có thể gán an toàn intcho một Integerbiến và ngược lại. Bạn có thể viết các biểu thức phức tạp bất kỳ mà không cần phân biệt giữa các loại intIntegercác loại.

Ví dụ:

Mã số Những gì trình biên dịch sẽ tạo ra
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. So sánh các biến bao bọc

Autoboxing và unboxing là các quy trình đơn giản và minh bạch. Chúng tôi sử dụng new Integer()các câu lệnh khi cần thiết và chúng tôi gọi intValue()phương thức khi cần thiết.

Mọi thứ hoạt động tốt đẹp và dễ dàng cho bạn, lập trình viên. Hãy nhớ rằng nếu bạn so sánh an Integervà an Integer, thì phép so sánh dựa trên tham chiếu chứ không phải giá trị.

Mã số Đầu ra bảng điều khiển
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

Các biến abkhông lưu trữ intgiá trị. Họ lưu trữ các tham chiếu đến các đối tượng. Điều đó có nghĩa là điều quan trọng là phải nhớ cách so sánh chúng một cách chính xác:

Sai Phải
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}