JavaScript is required

Cho đoạn mã sau. Chọn câu đúng
Racoon rocky;
SwampThing pogo;
Washer w;

rocky = new Racoon();
w = rocky;
pogo = w;

A.

Dòng 6 sẽ không biên dịch; cần phải có phép ép kiểu để chuyển từ kiểu Racoon sang kiểu Washer

B.

Dòng 7 sẽ không biên dịch; cần có phép ép kiểu để chuyển từ kiểu Washer sang kiểu SwampThing

C.

Đoạn mã sẽ biên dịch nhưng sẽ phát sinh Exception ở dòng 7 vì chuyển đổi kiểu khi thực thi từ interface sang class là không được phép

D.
Đoạn mã sẽ biên dịch và sẽ phát sinh Exception ở dòng 7 vì kiểu lớp của w tại thời điểm thực thi không thể chuyển sang kiểu SwampThing
Trả lời:

Đáp án đúng: B


Đoạn mã khai báo ba biến: `rocky` kiểu `Racoon`, `pogo` kiểu `SwampThing`, và `w` kiểu `Washer`. Sau đó, một đối tượng `Racoon` mới được tạo và gán cho `rocky`. `w` được gán bằng `rocky`, tức là `w` cũng trỏ đến đối tượng `Racoon`. Cuối cùng, `pogo` được gán bằng `w`. Vì `Racoon` không phải là một `SwampThing` (hoặc một lớp con của `SwampThing`), nên dòng `pogo = w;` sẽ gây ra lỗi biên dịch do không thể tự động chuyển đổi kiểu `Racoon` thành `SwampThing`. Cần phải có một phép ép kiểu tường minh để thực hiện việc này, nhưng ngay cả khi ép kiểu, nó vẫn có thể gây ra ngoại lệ tại thời gian chạy nếu đối tượng thực sự không phải là một thể hiện của `SwampThing`. Như vậy, dòng 7 sẽ không biên dịch, cần có phép ép kiểu để chuyển từ kiểu `Washer` (mà thực tế đang trỏ đến `Racoon`) sang kiểu `SwampThing`.

Câu hỏi liên quan