JavaScript is required

Chọn cách sửa ít nhất để đoạn mã sau biên dịch đúng:
final class Aaa {
int xxx;
void yyy() {
xxx = 1;
}
}

class Bbb {
final Aaa finalRef = new Aaa();

final void yyy() {
System.out.println("In method yyy()");
finalRef.xxx = 12345;
}
};

A.

Xóa từ final ở dòng 1

B.

Xóa từ final ở dòng 10

C.

Xóa từ final ở dòng 1 và 10

D.
Không cần phải chỉnh sửa gì
Trả lời:

Đáp án đúng: A


Đoạn mã trên có lỗi vì phương thức `yyy()` trong class `Bbb` cố gắng sửa đổi trường `xxx` của đối tượng `finalRef` (là một thể hiện của class `Aaa`) vốn được khai báo là `final`. Khi một biến tham chiếu được khai báo là `final`, nó có nghĩa là biến đó luôn trỏ đến cùng một đối tượng sau khi được khởi tạo. Tuy nhiên, trạng thái bên trong của đối tượng mà biến `final` trỏ đến (ví dụ: các trường của đối tượng) vẫn có thể thay đổi được, trừ khi các trường đó cũng được khai báo là `final`. Trong trường hợp này, `finalRef` là `final`, nghĩa là nó luôn trỏ đến cùng một đối tượng `Aaa`. Tuy nhiên, `xxx` trong class `Aaa` không phải là `final`, do đó chúng ta có thể thay đổi giá trị của `xxx` thông qua `finalRef`. Tuy nhiên, class `Aaa` được khai báo là `final`, điều này có nghĩa là không class nào có thể kế thừa từ nó. Điều này không gây ra lỗi trong đoạn mã đã cho. Và phương thức `yyy()` trong class `Bbb` cũng được khai báo là `final`, điều này có nghĩa là không class con nào có thể ghi đè nó. Điều này cũng không gây ra lỗi trong đoạn mã đã cho. Vì vậy, đoạn mã trên không có lỗi và biên dịch đúng, không cần sửa đổi gì cả.

Câu hỏi liên quan