JavaScript is required

Cho đoạn mã sau đây. Hãy chọn phát biểu đúng
Cat sunflower;
Washer wawa;
SwampThing pogo;

sunflower = new Cat();
wawa = sunflower;
pogo = (SwampThing) wawa;

A.

Dòng 6 không thể biên dịch; cần có một phép ép kiểu để chuyển từ kiểu Cat sang kiểu Washer

B.

Dòng 7 không thể biên dịch vì không thể ép từ kiểu interface sang kiểu class

C.

Đoạn mã sẽ dịch và chạy nhưng phép ép kiểu ở dòng 7 là thừa và có thể bỏ đi

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

Đáp án đúng: D


Đoạn mã khai báo các biến `sunflower` kiểu `Cat`, `wawa` kiểu `Washer`, và `pogo` kiểu `SwampThing`. Sau đó, một đối tượng `Cat` mới được gán cho `sunflower`. Biến `wawa` được gán bằng `sunflower`, điều này hợp lệ vì `sunflower` (kiểu `Cat`) có thể được gán cho `wawa` (kiểu `Washer`) nếu `Cat` kế thừa hoặc thực thi `Washer` (giả sử `Washer` là interface hoặc lớp cha). Tuy nhiên, ở dòng 7, `wawa` (hiện đang tham chiếu đến một đối tượng `Cat`) bị ép kiểu sang `SwampThing`. Nếu `Cat` không phải là một lớp con của `SwampThing`, việc ép kiểu này sẽ gây ra một `ClassCastException` tại thời điểm chạy, vì đối tượng thực tế mà `wawa` tham chiếu tới không thể được coi là một `SwampThing`.

Câu hỏi liên quan