Về cơ bản, các lớp chung chỉ hoạt động với các đối tượng và không hỗ trợ nguyên thủy. Kết quả là nếu chúng ta muốn làm việc với chúng, chúng ta phải chuyển đổi các giá trị nguyên thủy thành các đối tượng bao bọc
Ví dụ: Khung bộ sưu tập Java chỉ hoạt động với các đối tượng. Từ lâu khi [trước Java 5, gần 15 năm trước] không có autoboxing và chẳng hạn, chúng tôi không thể gọi add[5] trên một tập hợp các Số nguyên
Vào thời điểm đó, các giá trị nguyên thủy đó cần được chuyển đổi theo cách thủ công thành các lớp trình bao bọc tương ứng và được lưu trữ trong các bộ sưu tập
Ngày nay, với autoboxing, chúng ta có thể dễ dàng thực hiện ArrayList. add[101] nhưng trong nội bộ Java chuyển đổi giá trị nguyên thủy thành Số nguyên trước khi lưu trữ trong ArrayList bằng phương thức valueOf[]
3. Chuyển đổi lớp Primitive sang Wrapper
Bây giờ câu hỏi lớn là. làm cách nào để chuyển đổi một giá trị nguyên thủy thành một lớp bao bọc tương ứng e. g. int thành Integer hay char thành Character?
Chà, chúng ta có thể sử dụng hàm tạo hoặc phương thức nhà máy tĩnh để chuyển đổi một giá trị nguyên thủy thành một đối tượng của lớp trình bao bọc
Tuy nhiên, kể từ Java 9, hàm tạo cho nhiều hàm nguyên thủy được đóng hộp như or không được dùng nữa
Vì vậy, chúng tôi khuyên bạn chỉ nên sử dụng các phương thức xuất xưởng trên mã mới
Hãy xem một ví dụ về chuyển đổi một giá trị int thành một đối tượng Integer trong Java
Integer object = new Integer[1];
Integer anotherObject = Integer.valueOf[1];
Phương thức valueOf[] trả về một thể hiện đại diện cho giá trị int đã chỉ định
Nó trả về các giá trị được lưu trong bộ nhớ cache làm cho nó hiệu quả. Nó luôn lưu các giá trị trong khoảng từ -128 đến 127 vào bộ nhớ cache nhưng cũng có thể lưu vào bộ nhớ cache các giá trị khác nằm ngoài phạm vi này
Tương tự, chúng ta cũng có thể chuyển đổi boolean thành Boolean, byte thành Byte, char thành Character, long thành Long, float thành Float và double thành Double. Mặc dù nếu chúng ta phải chuyển đổi Chuỗi thành Số nguyên thì chúng ta cần sử dụng phương thức parseInt[] vì Chuỗi không phải là lớp bao bọc
Mặt khác, để chuyển đổi từ một đối tượng bao bọc thành một giá trị nguyên thủy, chúng ta có thể sử dụng phương thức tương ứng như intValue[], doubleValue[], v.v.
int val = object.intValue[];
Một tài liệu tham khảo toàn diện có thể được tìm thấy ở đây
4. Autoboxing và Unboxing
Trong phần trước, chúng tôi đã trình bày cách chuyển đổi thủ công một giá trị nguyên thủy thành một đối tượng
Sau Java 5, việc chuyển đổi này có thể được thực hiện tự động bằng cách sử dụng các tính năng được gọi là tự động đóng hộp và mở hộp
“Quyền anh” đề cập đến việc chuyển đổi một giá trị nguyên thủy thành một đối tượng bao bọc tương ứng. Bởi vì điều này có thể xảy ra tự động, nó được gọi là autoboxing
Tương tự, khi một đối tượng bao bọc được mở thành một giá trị nguyên thủy thì điều này được gọi là mở hộp
Điều này có nghĩa là trong thực tế, chúng ta có thể chuyển một giá trị nguyên thủy cho một phương thức cần một đối tượng trình bao hoặc gán một giá trị nguyên thủy cho một biến cần một đối tượng
List list = new ArrayList[];
list.add[1]; // autoboxing
Integer val = 2; // autoboxing
Trong ví dụ này, Java sẽ tự động chuyển đổi giá trị int nguyên thủy thành trình bao bọc
Trong nội bộ, nó sử dụng phương thức valueOf[] để tạo điều kiện thuận lợi cho việc chuyển đổi. Ví dụ, các dòng sau đây là tương đương
Integer value = 3;
Integer value = Integer.valueOf[3];
Mặc dù điều này giúp chuyển đổi dễ dàng và mã dễ đọc hơn, nhưng có một số trường hợp chúng ta không nên sử dụng autoboxing e. g. bên trong một vòng lặp
Tương tự như autoboxing, unboxing được thực hiện tự động khi chuyển một đối tượng đến một phương thức mong đợi một nguyên hàm hoặc khi gán nó cho một biến nguyên thủy
Integer object = new Integer[1];
int val1 = getSquareValue[object]; //unboxing
int val2 = object; //unboxing
public static int getSquareValue[int i] {
return i*i;
}
Về cơ bản, nếu chúng ta viết một phương thức chấp nhận một giá trị nguyên thủy hoặc đối tượng bao bọc, chúng ta vẫn có thể truyền cả hai giá trị cho chúng. Java sẽ đảm nhiệm việc chuyển đúng loại e. g. nguyên thủy hoặc trình bao bọc tùy thuộc vào ngữ cảnh
5. Phần kết luận
Trong hướng dẫn nhanh này, chúng ta đã nói về các lớp trình bao bọc trong Java, cũng như cơ chế tự động đóng hộp và mở hộp
Để đặt một int
vào một ArrayList
, hãy đặt int
bên trong một đối tượng của
int val = object.intValue[];
0. Hầu hết, công việc của lớp bao bọc int val = object.intValue[];
0 là cung cấp các đối tượng chứa dữ liệu nguyên thủy. Giờ đây, các đối tượng [và dữ liệu nguyên thủy mà chúng chứa] có thể được đưa vào một cấu trúc dữ liệu ArrayList
hoặc cấu trúc dữ liệu khác. Chương trình sau đây xây dựng một danh sách các số nguyên và sau đó viết chúng raimport java.util.* ; class WrapperExample { public static void main [ String[] args] { ArrayList data = new ArrayList[]; data.add[ new Integer[1] ]; data.add[ new Integer[3] ]; data.add[ new Integer[17] ]; data.add[ new Integer[29] ]; for [ int j=0; j < data.size[]; j++ ] System.out.print[ data.get[j] + " " ]; System.out.println[ ]; } }
Chương trình viết ra
1 3 17 29
Hình ảnh nhấn mạnh rằng ArrayList
chứa một mảng tham chiếu đối tượng, như mọi khi. Nó hiển thị các int
, mỗi cái được chứa trong một hộp nhỏ đại diện cho đối tượng bao bọc