JavaRush /Blog Java /Random-VI /Các kiểu dữ liệu tham chiếu trong Java

Các kiểu dữ liệu tham chiếu trong Java

Xuất bản trong nhóm
Nếu không hiểu cú pháp Java thì không thể trở thành một nhà phát triển nghiêm túc nên hôm nay chúng ta tiếp tục tìm hiểu cú pháp. Trong một trong những bài viết trước chúng ta đã nói về các biến nguyên thủy, nhưng vì có hai loại biến nên hôm nay chúng ta sẽ nói về loại thứ hai - các kiểu tham chiếu trong Java. Vậy đo la cai gi? Tại sao các kiểu dữ liệu tham chiếu lại cần thiết trong Java? Các kiểu dữ liệu tham chiếu trong Java - 1Hãy tưởng tượng rằng chúng ta có một đối tượng TV với một số đặc điểm, chẳng hạn như số kênh, âm lượng và cờ:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
Làm cách nào một loại đơn giản như , có thể intlưu trữ dữ liệu này? Hãy nhớ: một biến intlà 4 byte. Nhưng bên trong có hai biến (4 byte + 4 byte) cùng loại và boolean(+1 byte)... Tổng cộng - 4 đến 9, nhưng theo quy luật, nhiều thông tin hơn được lưu trữ trong một đối tượng. Phải làm gì? Bạn không thể đặt một đối tượng vào một biến. Tại thời điểm này trong câu chuyện của chúng ta, các biến tham chiếu xuất hiện. Các biến tham chiếu lưu trữ địa chỉ của vị trí bộ nhớ chứa một đối tượng cụ thể. Nghĩa là, đây là một “danh thiếp” có địa chỉ mà chúng ta có thể tìm thấy đối tượng của mình trong bộ nhớ dùng chung và thực hiện một số thao tác với nó. Tham chiếu tới bất kỳ đối tượng nào trong Java đều là một biến tham chiếu. Đây là giao diện của đối tượng TV của chúng ta:
TV telly = new TV();
Chúng tôi đặt tên biến loại TV thành tellyliên kết đến đối tượng được tạo thuộc loại TV. Nghĩa là, JVM phân bổ bộ nhớ trên heap cho đối tượng TV, tạo đối tượng TV và địa chỉ đến vị trí của nó trong bộ nhớ, đặt nó vào biến tellyđược lưu trữ trên ngăn xếp. Bạn có thể đọc thêm về bộ nhớ, cụ thể là ngăn xếp và nhiều thông tin hữu ích khác trong bài giảng này . Một biến thuộc loại TV và một đối tượng thuộc loại TV, bạn có để ý không? Điều này không phải không có lý do: các đối tượng thuộc một loại nhất định phải có các biến tương ứng cùng loại (không tính việc triển khai kế thừa và giao diện, nhưng hiện tại chúng tôi không tính đến điều này). Rốt cuộc, chúng ta sẽ không rót súp vào ly phải không? Hóa ra đối tượng của chúng ta là một chiếc TV và biến tham chiếu cho nó giống như một bảng điều khiển. Sử dụng điều khiển từ xa này, chúng ta có thể tương tác với đối tượng và dữ liệu của nó. Ví dụ: đặt các đặc điểm cho TV của chúng tôi:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Ở đây, chúng tôi đã sử dụng toán tử dấu chấm .để truy cập và bắt đầu sử dụng các phần tử bên trong của đối tượng mà biến đó đề cập đến. Ví dụ: ở dòng đầu tiên, chúng tôi đã nói với biến telly: “Hãy cung cấp cho chúng tôi một biến nội bộ isOncủa đối tượng bạn đang tham chiếu và đặt nó thành true” (bật TV cho chúng tôi).

Xác định lại các biến tham chiếu

Giả sử chúng ta có hai biến thuộc loại tham chiếu và các đối tượng mà chúng tham chiếu đến:
TV firstTV = new TV();
TV secondTV = new TV();
Nếu chúng ta viết:
firstTV = secondTV;
điều này có nghĩa là chúng ta đã gán biến đầu tiên làm giá trị một bản sao của địa chỉ (giá trị của các bit địa chỉ) cho đối tượng thứ hai và bây giờ cả hai biến đều tham chiếu đến đối tượng thứ hai (nói cách khác, hai điều khiển từ xa cho cùng một đối tượng). TRUYỀN HÌNH). Đồng thời, đối tượng đầu tiên không có biến tham chiếu đến nó. Kết quả là, chúng ta có một đối tượng không thể truy cập được, bởi vì biến đó là một luồng có điều kiện đối với nó, nếu không có nó, nó sẽ biến thành rác, chỉ nằm trong bộ nhớ và chiếm dung lượng. Đối tượng này sau đó sẽ bị bộ thu gom rác hủy khỏi bộ nhớ . Các kiểu dữ liệu tham chiếu trong Java - 2Bạn có thể ngắt kết nối với một đối tượng mà không cần liên kết khác:
secondTV = null;
Kết quả là, sẽ chỉ có một liên kết đến đối tượng - firstTV, và secondTVsẽ không trỏ đến bất kỳ ai nữa (điều này không ngăn cản chúng tôi gán cho nó một liên kết đến một số đối tượng như TV trong tương lai).

Lớp chuỗi

Riêng biệt, tôi muốn đề cập đến lớp String . Đây là lớp cơ sở được thiết kế để lưu trữ và làm việc với dữ liệu được lưu trữ dưới dạng chuỗi. Ví dụ:
String text = new String("This TV is very loud");
Ở đây chúng ta đã chuyển một chuỗi sẽ được lưu trữ trong hàm tạo của đối tượng. Nhưng không ai làm điều đó. Rốt cuộc, chuỗi có thể được tạo:
String text = "This TV is very loud";
Tiện lợi hơn nhiều phải không? Về mức độ phổ biến trong sử dụng, Stringnó không thua kém các kiểu nguyên thủy nhưng vẫn là một lớp và biến trỏ đến nó không phải là kiểu nguyên thủy mà là kiểu tham chiếu. Chúng tôi Stringcó khả năng nối chuỗi tuyệt vời này:
String text = "This TV" + " is very loud";
Kết quả chúng ta sẽ nhận được văn bản một lần nữa: This TV is very loud, vì hai dòng sẽ được kết hợp thành một tổng thể và biến sẽ tham chiếu đến toàn văn bản này. Một sắc thái quan trọng là Stringđây là một lớp bất biến. Nó có nghĩa là gì? Hãy lấy ví dụ này:
String text = "This TV";
text = text + " is very loud";
Có vẻ như mọi thứ đều đơn giản: chúng ta khai báo một biến, gán cho nó một giá trị. Ở dòng tiếp theo, chúng tôi thay đổi nó. Nhưng chúng tôi không thực sự thay đổi. Vì đây là lớp không thể thay đổi nên trên dòng thứ hai, giá trị ban đầu không thay đổi mà một giá trị mới được tạo, do đó bao gồm giá trị đầu tiên + " is very loud".

Hằng số tham chiếu

Trong bài viết về các kiểu nguyên thủy, chúng ta đã đề cập đến chủ đề về hằng số. Biến tham chiếu sẽ hoạt động như thế nào khi chúng ta khai báo nó là cuối cùng ?
final TV telly = new TV();
Bạn có thể nghĩ rằng điều này sẽ làm cho đối tượng trở nên bất biến. Nhưng không, điều đó không đúng. Các kiểu dữ liệu tham chiếu trong Java - 3Một biến tham chiếu có công cụ sửa đổi finalsẽ bị ràng buộc với một đối tượng cụ thể mà không có khả năng hủy liên kết theo bất kỳ cách nào (xác định lại hoặc đánh đồng nó với null). Nghĩa là, sau khi đặt giá trị của một biến như vậy, hãy viết mã như sau:
telly = new TV();
hoặc
telly = null;
sẽ gây ra lỗi biên dịch. Tức là finalnó chỉ tác động lên liên kết và không có tác dụng gì lên chính đối tượng đó. Nếu ban đầu chúng ta có thể thay đổi nó, chúng ta có thể thay đổi trạng thái bên trong của nó mà không gặp vấn đề gì:
telly.soundVolume = 30;
Đôi khi, các biến được chỉ định là cuối cùng ngay cả trong các đối số của phương thức!
public void enableTV (final TV telly){
   telly.isOn = true;
}
Điều này được thực hiện để trong quá trình viết một phương thức, các đối số này không thể bị ghi đè và do đó ít gây nhầm lẫn hơn. Điều gì sẽ xảy ra nếu chúng ta biểu thị finalmột biến tham chiếu đề cập đến một đối tượng bất biến? Ví dụ String:
final String PASSWORD = "password";
Kết quả là chúng ta sẽ nhận được một hằng số, một dạng tương tự của các hằng số kiểu nguyên thủy, bởi vì ở đây chúng ta không thể xác định lại tham chiếu cũng như không thể thay đổi trạng thái bên trong của đối tượng (dữ liệu nội bộ).

Hãy tóm tắt lại

  1. Trong khi các biến đơn giản lưu trữ các bit giá trị, các biến tham chiếu lưu trữ các bit biểu thị cách truy xuất một đối tượng.
  2. Tham chiếu đối tượng chỉ được khai báo cho một loại đối tượng.
  3. Bất kỳ lớp nào trong Java đều là một kiểu tham chiếu.
  4. Giá trị mặc định của bất kỳ biến tham chiếu nào trong Java là null.
  5. Stringlà một ví dụ tiêu chuẩn của loại tham chiếu. Lớp này cũng là bất biến.
  6. Các biến tham chiếu có công cụ sửa đổi finalchỉ được liên kết với một đối tượng mà không có khả năng xác định lại.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION