Tổng quan
Java cung cấp hai loại dữ liệu kiểu Nguyên thủy và kiểu dữ liệu Tham chiếu . Các kiểu dữ liệu Nguyên thủy được xác định trước(tức là phải khai báo trước), trong khi kiểu dữ liệu Tham chiếu chỉ là địa chỉ tham chiếu lưu trữ dữ liệu và không cần khai báo giá trị trước(khai báo null).
Trong Java, các kiểu dữ liệu không nguyên thủy(non-primitive) được gọi là các kiểu Tham chiếu. Nói cách khác, một biến của lớp được gọi là kiểu dữ liệu Tham chiếu . Nó chứa địa chỉ(hoặc tham chiếu) của các đối tượng được tạo. Ví dụ: nếu Demo là một lớp và chúng ta đã tạo đối tượng d của nó, thì biến d được gọi là kiểu tham chiếu.
Một số tính chất:
- Kiểu Tham chiếu đề cập hay tham chiếu đến các đối tượng.
- Nó có thể không được xác định trước(khai báo null).
- Nó được tạo ra bởi chương trình nếu được yêu cầu.
- Các kiểu Tham chiếu giữ các tham chiếu của các đối tượng.
- Tất cả các loại tham chiếu là một lớp con của class java.lang.Object(class được tạo sẽ tự động kế thừa class Object của Java), vì thế chúng có đầy đủ các thành phần của Object class như phương thức equals, hasCode, toString,…
- Nó cung cấp quyền truy cập vào các đối tượng được lưu trữ trong bộ nhớ.
- Biến tham chiếu lưu trong bộ nhớ Stack, tham chiếu đến đối tượng lưu trong bộ nhớ Heap
Các ví dụ về kiểu dữ liệu tham chiếu là class, interface, String, Mảng, v.v.
Các kiểu Tham chiếu của Java
Có 5 loại kiểu tham chiếu sau trong Java:
Loại tham chiếu | Sự miêu tả |
---|---|
Lớp(Class) | Nó là một tập hợp các hướng dẫn. Nó mô tả nội dung của đối tượng. |
Mảng | Nó cung cấp cấu trúc dữ liệu có kích thước cố định lưu trữ các phần tử cùng loại. |
Annotation | Nó cung cấp một cách để liên kết siêu dữ liệu với các phần tử chương trình. |
Interface | Nó được thực hiện bởi các lớp Java. |
Enum | Mỗi phần tử bên trong enum là một thể hiện của enum đó. |
So sánh kiểu Tham chiếu với kiểu Nguyên thủy
Loại Tham chiếu | Loại Nguyên thủy |
---|---|
Không được xác định trước ngoại trừ kiểu String. | Được xác định trước. |
Tất cả các loại tham chiếu bắt đầu bằng chữ Hoa. | Tất cả các loại nguyên thủy bắt đầu bằng một chữ cái viết thường. |
Các loại không nguyên thủy có cùng kích thước. | Kích thước của một kiểu nguyên thủy phụ thuộc vào kiểu dữ liệu. |
Nó được sử dụng để gọi đối tượng hoặc gọi các phương thức. | Chúng ta không thể gọi phương thức với kiểu nguyên thủy. |
Nó có thể là null. | Nó không thể là null. Nó luôn có giá trị. |
Ví dụ về các kiểu dữ liệu tham chiếu là lớp, Mảng, Chuỗi(String), Interface, v.v. | Ví dụ về các kiểu dữ liệu nguyên thủy là int, float, double, boolean, long, v.v. |
Theo mặc định, JVM phân bổ 8 byte cho mỗi biến tham chiếu. | Kích thước của nó phụ thuộc vào kiểu dữ liệu. |
Phân bổ bộ nhớ và thu gom rác
Trong Java, từ khóa new được sử dụng để tạo một đối tượng của lớp. Nói cách khác, nó khởi tạo một lớp bằng cách cấp phát bộ nhớ cho một đối tượng mới và trả về một tham chiếu đến bộ nhớ đó. Các đối tượng chiếm bộ nhớ trong không gian heap, trong khi các biến tham chiều được phân bổ trong bộ nhờ Stack. Chúng ta cũng có thể sử dụng từ khóa new để tạo đối tượng mảng.
ClassName objectName = new ClassName();
Nếu không có tham chiếu đến một đối tượng, bộ nhớ được sử dụng bởi đối tượng đó có thể bị thu hồi trong quá trình Thu gom rác(garbage collection process).
Chuyển đổi giữa Loại Nguyên thủy và loại Tham chiếu
Việc chuyển đổi kiểu Nguyên thủy thành kiểu Tham chiếu được gọi là autoboxing(đóng lại) và việc chuyển đổi kiểu Tham chiếu thành kiểu Nguyên thủy được gọi là Unboxing(mở ra).
Toán tử so sánh bằng (==) và phương thức so sánh equals() trong kiểu Tham chiếu
Khi bạn sử dụng toán từ bằng(==) để so sánh 2 đối tượng ví dụ: d1 == d2, thì bạn đang so sánh 2 địa chỉ của nó mà không phải là giá trị của nó tham chiếu tới. Vì thế, chỉ khi địa chỉ bộ nhớ (tham chiếu) của cả hai đối tượng giống nhau thì kết quả trả về mới là true.
Để so sánh giá trị của tham chiếu, bạn phải dùng phương thức equals để so sánh. Lưu ý: Ngoài đối tượng của lớp String không cần phải override phương thức equals() và hashCode(), các đối tượng khác bạn phải override 2 method này để trả về kết quả đúng(xin tham khảo ở một bài khác)
Tài liệu tham khảo:
Để lại một phản hồi
Bạn phải đăng nhập để gửi phản hồi.