CodeGym/Blog Java/Ngẫu nhiên/Autoboxing và Unboxing trong Java

Autoboxing và Unboxing trong Java

Xuất bản trong nhóm
Trong Java, một tính năng của nguyên thủy và trình bao bọc của chúng là tự động đóng hộp/mở hộp. Hãy đi sâu vào khái niệm này. Như chúng ta đã biết, Java là ngôn ngữ hướng đối tượng. Điều đó có nghĩa là tất cả các chương trình viết bằng Java đều được tạo từ các đối tượng. Nguyên thủy không phải là đối tượng. Nhưng ngay cả như vậy, một biến bao bọc có thể được gán một giá trị nguyên thủy. Quá trình này được gọi là autoboxing. Tương tự, một biến nguyên thủy có thể được gán một đối tượng bao bọc. Quá trình này được gọi là mở hộp. Ví dụ:

public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // Unboxing
       y = x * 123; // Autoboxing
   }
}
Ở dòng 5, chúng ta gán y, là một đối tượng Integer , cho x nguyên thủy . Như bạn có thể thấy, chúng ta không phải thực hiện thêm bất kỳ bước nào: trình biên dịch biết rằng intInteger về cơ bản là giống nhau. Đó là mở hộp. Điều gì đó tương tự đang xảy ra với tính năng tự động đóng hộp trên dòng 6: giá trị nguyên thủy (x * 123) có thể dễ dàng được gán cho đối tượng y . Đây là một ví dụ về autoboxing. Đó là lý do tại sao thuật ngữ này bao gồm từ "tự động": bởi vì bạn không phải làm bất cứ điều gì đặc biệt để gán các nguyên hàm cho các đối tượng bao bọc tương ứng của chúng (và ngược lại). Tất cả đều diễn ra tự động. Thuận tiện nhỉ? :) Chúng ta thấy một ví dụ khác về sự tiện lợi của việc tự động đóng hộp/mở hộp khi làm việc với các phương thức. Điều này là do các đối số của phương thức cũng được tự động đóng hộp và không được đóng hộp. Ví dụ: nếu một phương thức lấy hai đối tượng Integer làm đầu vào, thay vào đó chúng ta có thể dễ dàng chuyển int s thông thường!

public class Main {
   public static void main(String[] args) {

       printNumber(7);// A standard int, not even an int variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered the number " + i);
   }
}
Đầu ra:
You entered the number 7
Nó cũng hoạt động theo hướng khác:

public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered the number " + i);
   }
}
Một điểm quan trọng bạn cần nhớ là: tính năng tự động đóng hộp và mở hộp không hoạt động đối với mảng!

public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};
      
       printArray(i);// Error, this won't compile!
   }
  
   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
Cố gắng chuyển một mảng nguyên thủy sang một phương thức lấy một mảng đối tượng sẽ dẫn đến lỗi biên dịch. Để kết luận, chúng ta hãy so sánh ngắn gọn các nguyên thủy và các hàm bao một lần nữa.

Nguyên thủy:

  • Có lợi thế về hiệu suất
Giấy gói:
  • Cho phép chúng tôi không vi phạm nguyên tắc "mọi thứ đều là đối tượng", nghĩa là các số, ký tự và giá trị boolean không vi phạm khái niệm này
  • Mở rộng khả năng làm việc với các giá trị này bằng cách cung cấp các phương thức và trường thuận tiện
  • Cần thiết khi một phương thức chỉ hoạt động với các đối tượng
Để củng cố những gì bạn đã học, chúng tôi khuyên bạn nên xem bài học video từ Khóa học Java của chúng tôi
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào