JavaRush /Blog Java /Random-VI /Đóng gói, tháo dỡ và đóng gói

Đóng gói, tháo dỡ và đóng gói

Xuất bản trong nhóm
Xin chào! Bạn đã khá quen thuộc với các kiểu nguyên thủy và đã làm việc với chúng rất nhiều. Gói, mở và đóng gói - 1Các nguyên thủy trong lập trình và đặc biệt là trong Java có nhiều ưu điểm: chúng chiếm ít bộ nhớ, do đó làm tăng hiệu quả của chương trình và được phân chia rõ ràng thành các phạm vi giá trị. Tuy nhiên, trong quá trình học Java, chúng ta đã lặp đi lặp lại nhiều lần, giống như một câu thần chú, “ trong Java mọi thứ đều là một đối tượng ”. Nhưng nguyên thủy là sự bác bỏ trực tiếp những từ này. Chúng không phải là đồ vật. Vậy nguyên lý “vạn vật đều là vật” là sai? Không thực sự. Trong Java, mọi kiểu nguyên thủy đều có người anh em song sinh của nó, lớp bao bọc ( Wrapper). Một cái bọc là gì? Trình bao bọc là một lớp đặc biệt lưu trữ giá trị nguyên thủy bên trong chính nó. Nhưng vì đây là một lớp nên nó có thể tạo các thể hiện của riêng mình. Chúng sẽ lưu trữ các giá trị nguyên thủy cần thiết bên trong, đồng thời là các đối tượng thực. Tên của các lớp trình bao bọc rất giống với tên của các lớp nguyên thủy tương ứng hoặc hoàn toàn trùng khớp với chúng. Vì vậy, sẽ rất dễ dàng để ghi nhớ chúng.
Các lớp trình bao bọc cho các kiểu dữ liệu nguyên thủy
Các kiểu dữ liệu nguyên thủy Lớp bao bọc
int số nguyên
ngắn Ngắn
dài Dài
byte Byte
trôi nổi Trôi nổi
gấp đôi Gấp đôi
ký tự Tính cách
boolean Boolean
Các đối tượng của lớp Wrapper được tạo giống như bất kỳ đối tượng nào khác:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Các lớp trình bao bọc cho phép bạn giảm thiểu những nhược điểm mà các kiểu nguyên thủy gặp phải. Điều rõ ràng nhất là người nguyên thủy không có phương thức . Ví dụ: họ không có phương thức toString(), vì vậy bạn không thể chuyển đổi một số intthành chuỗi. Nhưng với một lớp bao bọc Integerthì điều đó thật dễ dàng.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Cũng sẽ có những khó khăn với việc chuyển đổi ngược lại. Giả sử chúng ta có một chuỗi mà chúng ta biết chắc chắn chứa một số. Tuy nhiên, trong trường hợp thuộc kiểu nguyên thủy, intchúng ta sẽ không thể lấy số này từ chuỗi và thực tế biến nó thành một số. Nhưng nhờ có các lớp bao bọc, giờ đây chúng ta có cơ hội này.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Đầu ra: 1166628 Chúng tôi đã truy xuất thành công một số từ một chuỗi và gán nó cho một biến tham chiếu Integer i. Nhân tiện, về các liên kết. Bạn đã biết rằng các tham số được truyền cho các phương thức theo nhiều cách khác nhau: các tham số gốc được truyền theo giá trị và các đối tượng được truyền theo tham chiếu. Bạn có thể sử dụng kiến ​​thức này khi tạo phương thức của mình: ví dụ: nếu phương thức của bạn hoạt động với số phân số, nhưng bạn cần logic truyền theo tham chiếu, bạn có thể truyền tham số cho phương thức Double/Floatthay vì double/float. Ngoài ra, ngoài các phương thức, các lớp trình bao bọc còn có các trường tĩnh rất thuận tiện khi sử dụng. Ví dụ: hãy tưởng tượng rằng bây giờ bạn đang phải đối mặt với một nhiệm vụ: in số tối đa có thể có trên bảng điều khiển intvà sau đó là số tối thiểu có thể có. Nhiệm vụ này có vẻ đơn giản nhưng bạn vẫn khó có thể thực hiện được nếu không có Google. Và các lớp trình bao bọc dễ dàng cho phép bạn giải quyết các “vấn đề hàng ngày” sau:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Những lĩnh vực như vậy cho phép bạn không bị phân tâm khỏi những nhiệm vụ nghiêm trọng hơn. Chưa kể đến việc trong quá trình in số 2147483647 (chính xác là MAX_VALUE), việc gõ nhầm nó không có gì đáng ngạc nhiên :) Ngoài ra, trong một trong những bài giảng trước, chúng ta đã chú ý đến thực tế là các đối tượng của các lớp bao bọc là bất biến .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
Đầu ra: 0 Đối tượng mà tham chiếu trỏ tới ban đầu аkhông thay đổi trạng thái, nếu không thì giá trị bcũng sẽ thay đổi. Giống như String, thay vì thay đổi trạng thái của đối tượng bao bọc, một đối tượng hoàn toàn mới sẽ được tạo trong bộ nhớ. Tại sao những người tạo ra Java cuối cùng lại quyết định giữ lại các kiểu nguyên thủy trong ngôn ngữ? Vì mọi thứ phải là một đối tượng và chúng ta đã có các lớp bao bọc có thể được sử dụng để thể hiện mọi thứ mà kiểu nguyên thủy biểu thị, tại sao không để chúng trong ngôn ngữ và loại bỏ các kiểu nguyên thủy? Câu trả lời rất đơn giản - hiệu suất. Các kiểu nguyên thủy được gọi là nguyên thủy vì chúng không có nhiều tính năng “nặng” của đối tượng. Đúng, một đối tượng có nhiều phương thức tiện lợi, nhưng không phải lúc nào bạn cũng cần đến chúng. Đôi khi bạn chỉ cần số 33 hoặc 2,62 hoặc giá trị của true/ false. Trong những tình huống mà tất cả lợi ích của các đối tượng đều không liên quan và không cần thiết để chương trình hoạt động, thì những đối tượng nguyên thủy sẽ thực hiện công việc tốt hơn nhiều.

Tự động đóng gói/tự động giải nén

Một trong những tính năng của các lớp nguyên thủy và các lớp bao bọc của chúng trong Java là autoboxing/autounboxing.Chúng Bọc, mở và đóng gói - 2 ta hãy hiểu khái niệm này. Như bạn và tôi đã biết trước đó, Java là ngôn ngữ hướng đối tượng. Điều này có nghĩa là tất cả các chương trình viết bằng Java đều được tạo thành từ các đối tượng. Nguyên thủy không phải là đối tượng. Tuy nhiên, biến lớp bao bọc có thể được gán một giá trị thuộc kiểu nguyên thủy. Quá trình này được gọi là autoboxing . Theo cách tương tự, một biến có kiểu nguyên thủy có thể được gán một đối tượng của lớp bao bọc. Quá trình này được gọi là tự động hủy hộp thư . Ví dụ:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
Ở dòng 5, chúng ta gán cho x nguyên thủy giá trị của y, là một đối tượng của lớp bao bọc Integer. Như bạn có thể thấy, không cần thực hiện thêm hành động nào cho việc này: trình biên dịch biết điều đó intIntegertrên thực tế, điều tương tự . Đây là tính năng tự động giải nén. Điều tương tự cũng xảy ra với tính năng tự động đóng hộp ở dòng 6: đối tượng y dễ dàng được gán giá trị nguyên thủy (x*123). Đây là một ví dụ về tự động đóng gói. Đây là lý do tại sao từ “auto” được thêm vào: để gán các tham chiếu nguyên thủy cho các đối tượng của các lớp trình bao bọc của chúng (và ngược lại), bạn không cần phải làm gì cả, mọi thứ diễn ra tự động . Thuận tiện, phải không? :) Một tiện ích rất lớn khác của việc tự động đóng gói/tự động giải nén được thể hiện trong hoạt động của các phương thức. Thực tế là các tham số của phương thức cũng phải tuân theo tính năng tự động đóng gói và tự động giải nén . Và, ví dụ, nếu một trong số chúng lấy hai đối tượng làm đầu vào Integer, chúng ta có thể dễ dàng chuyển các giá trị nguyên thủy thông thường vào đó int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
Kết quả: Bạn đã nhập số 7. Nó hoạt động theo cách ngược lại:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
Một điểm quan trọng cần nhớ: 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, 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 làm đầu vào sẽ gây ra lỗi biên dịch. Cuối cùng, chúng ta hãy so sánh ngắn gọn một lần nữa các nguyên hàm và hàm bao Nguyên thủy:
  • có lợi thế về hiệu suất
Giấy gói:
  • Chúng cho phép bạn không vi phạm nguyên tắc “mọi thứ đều là một đối tượng”, để các con số, ký hiệu và giá trị boolean đúng/sai không nằm ngoài 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 số phương thức có thể hoạt động độc quyền với các đối tượng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION