Cho khối lệnh như sau:
String[] students = new String;
String studentName = “Peter Parker”;
students = studentName;
studentName = null;
Có bao nhiêu đối tượng tham chiếu của đối tượng mảng và biến tồn tại sau khi thực hiện khối lệnh?
Trả lời:
Đáp án đúng: B
Đoạn mã Java này có lỗi biên dịch. Dòng đầu tiên `String[] students = new String;` cố gắng khởi tạo một mảng String nhưng không chỉ định kích thước của mảng. Điều này gây ra lỗi biên dịch. Giả sử dòng này được sửa thành `String[] students = new String[1];` thì phân tích như sau:
1. `String[] students = new String[1];` Khởi tạo một mảng `students` có kích thước 1. `students` là một tham chiếu đến đối tượng mảng.
2. `String studentName = “Peter Parker”;` Khởi tạo một biến `studentName` và gán cho nó chuỗi “Peter Parker”. `studentName` là một tham chiếu đến đối tượng chuỗi “Peter Parker”.
3. `students = studentName;` Gán tham chiếu của `studentName` (đến chuỗi “Peter Parker”) cho `students`. Bây giờ, `students` cũng tham chiếu đến chuỗi “Peter Parker”. Đối tượng mảng ban đầu được tạo ở bước 1 sẽ không còn được tham chiếu đến nữa (nó có thể được garbage collector thu hồi).
4. `studentName = null;` Gán `null` cho `studentName`. `studentName` không còn tham chiếu đến đối tượng chuỗi “Peter Parker” nữa.
Sau khi thực hiện đoạn mã (đã sửa lỗi), chỉ có một đối tượng chuỗi “Peter Parker” và biến `students` đang tham chiếu đến nó. Mảng ban đầu (nếu được khởi tạo đúng) không còn được tham chiếu đến. Vì vậy, chỉ có 1 đối tượng được tham chiếu.
Tuy nhiên, vì đoạn mã gốc bị lỗi, nên không có đáp án nào đúng hoàn toàn. Nếu bỏ qua lỗi biên dịch và xem xét đoạn mã đã sửa, đáp án A là hợp lý nhất.