CHÀO! Bạn đã quen thuộc với các kiểu nguyên thủy và đã làm việc khá nhiều với chúng. Trong lập trình (và đặc biệt là Java), các nguyên hàm có nhiều ưu điểm: chúng sử dụng ít bộ nhớ (và do đó làm cho chương trình hiệu quả hơn) và có một phạm vi giá trị được phân định rõ ràng. Tuy nhiên, khi học Java, chúng ta thường nhắc đi nhắc lại câu thần chú "mọi thứ trong Java đều là đối tượng". Nhưng những người nguyên thủy mâu thuẫn trực tiếp với những từ đó. Chúng không phải là đồ vật. Vì vậy, nguyên tắc "mọi thứ đều là đối tượng" của chúng ta có sai không? Trên thực tế, không phải vậy. Trong Java, mọi kiểu nguyên thủy đều có một người anh em sinh đôi, một lớp bao bọc.
Lớp Wrapper là gì?
Trình bao bọc là một lớp đặc biệt lưu trữ nội bộ nguyên thủy. Nhưng vì nó là một lớp nên bạn có thể tạo các thể hiện của nó. Chúng lưu trữ các giá trị nguyên thủy bên trong, nhưng vẫn là các đối tượng thực. Tên lớp trình bao bọc rất giống với (hoặc hoàn toàn giống với) tên của các nguyên hàm tương ứng của chúng. Vì vậy, chúng rất dễ nhớ.
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 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 |
than |
Tính cách |
boolean |
Boolean |
Các đối tượng trình bao bọc đượ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 bao bọc cho phép chúng tôi giảm thiểu những thiếu sót của các kiểu nguyên thủy. Rõ ràng nhất là nguyên thủy không có phương pháp. Ví dụ: họ không có phương thức
toString() , vì vậy, chẳng hạn, bạn không thể chuyển đổi một
int thành
String . Nhưng lớp trình bao bọc
Integer giúp việc này trở nên dễ dàng.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
Tuy nhiên, chuyển đổi theo hướng khác có thể phức tạp hơn. Giả sử chúng ta có một
String mà chúng ta biết chắc chắn có chứa một số. Bất kể, không có cách riêng nào để sử dụng
int nguyên thủy để trích xuất số từ
Chuỗi và chuyển đổi nó thành số. Nhưng, chúng ta có thể với các lớp bao bọc.
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 đã trích xuất thành công một số từ
Chuỗi và gán nó cho biến tham chiếu Số
nguyên i . Nhân tiện, liên quan đến tài liệu tham khảo. Bạn đã biết rằng các đối số được truyền cho các phương thức theo nhiều cách khác nhau: nguyên hàm theo giá trị và đối tượng 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 riêng mình: ví dụ: nếu phương thức của bạn sử dụng số phân số nhưng bạn cần logic để truyền tham chiếu, bạn có thể truyền đối số
Double /
Float cho phương thức thay vì
double /
float . Ngoài các phương thức của lớp trình bao bọc, các trường tĩnh của chúng cũng có thể rất thuận tiện. Ví dụ: hãy tưởng tượng bạn có nhiệm vụ sau: hiển thị số lượng tối đa có thể
giá trị int , theo sau là giá trị nhỏ nhất có thể. Vấn đề này có vẻ khá cơ bản. Nhưng không có Google, chưa chắc bạn đã làm được. Nhưng các trình bao bọc cho phép bạn dễ dàng xử lý các "nhiệm vụ trần tục" như vậy:
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 này giúp bạn không bị phân tâm khỏi việc hoàn thành các nhiệm vụ nghiêm trọng hơn. Chưa kể đến việc gõ
2147483647 (là giá trị của MAX_VALUE) không phải là chuyện nhỏ! :) Hơn nữa, trong bài học trước, chúng ta đã chỉ ra rằng các đối tượng 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
Trạng thái của đối tượng ban đầu được chỉ ra bởi
a không thay đổi (vì giá trị của
b cũng sẽ thay đổi). Như với
String s, 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 được tạo trong bộ nhớ. Vì vậy, tại sao những người tạo ra Java cuối cùng lại quyết định để 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 trình bao bọc có thể diễn đạt mọi thứ mà các hàm nguyên thủy thể hiện, tại sao không chỉ giữ các hàm bao bọc trong ngôn ngữ và loại bỏ các hàm nguyên thủy? Câu trả lời rất đơn giản: hiệu suất. Các loại nguyên thủy được gọi là nguyên thủy vì chúng thiếu nhiều tính năng "nặng ký" của các đối tượng. Vâng, các đối tượng có nhiều phương thức thuận tiện, nhưng không phải lúc nào bạn cũng cần đến chúng. Đôi khi, tất cả những gì bạn cần là số 33 hoặc 2,62 hoặc
true /
false . Trong các tình huống mà lợi thế của các đối tượng không quan trọng và không cần thiết để chương trình hoạt động, thì các nguyên hàm phù hợp hơn nhiều với nhiệm vụ.
GO TO FULL VERSION