Cho đoạn chương trình sau:
class Cruncher {
void cruncher(int i) {
System.out.println("int version");
}
void crunch(String s) {
System.out.println("String version");
}
public static void main(String[] args) {
Cruncher crun = new Cruncher();
char ch = ''
p '';
crun.crunch(ch);
}
}
class Cruncher {
void cruncher(int i) {
System.out.println("int version");
}
void crunch(String s) {
System.out.println("String version");
}
public static void main(String[] args) {
Cruncher crun = new Cruncher();
char ch = ''
p '';
crun.crunch(ch);
}
}
void cruncher(int i) {
System.out.println("int version");
}
void crunch(String s) {
System.out.println("String version");
}
public static void main(String[] args) {
Cruncher crun = new Cruncher();
char ch = ''
p '';
crun.crunch(ch);
}
}
Trả lời:
Đáp án đúng: D
Đoạn chương trình Java cung cấp một class `Cruncher` với hai phương thức `crunch`, một nhận tham số kiểu `int` và một nhận tham số kiểu `String`. Trong phương thức `main`, một đối tượng `Cruncher` được tạo ra, và sau đó phương thức `crunch` được gọi với một biến `char` có giá trị 'p'.
Trong Java, kiểu `char` là một kiểu số nguyên 16-bit Unicode. Khi một phương thức được gọi với một tham số mà kiểu dữ liệu không khớp chính xác với bất kỳ overload nào của phương thức đó, Java sẽ cố gắng thực hiện widening conversion (chuyển đổi mở rộng) để tìm một overload phù hợp. Trong trường hợp này, kiểu `char` có thể được chuyển đổi ngầm định thành kiểu `int`, vì vậy phương thức `cruncher(int i)` sẽ được gọi.
Tuy nhiên, có một lỗi chính tả trong dòng khai báo biến `char ch = ''p '';`. Cú pháp này không hợp lệ và sẽ gây ra lỗi biên dịch. Do đó, chương trình sẽ không biên dịch được.
Vậy, đáp án đúng là B: dòng 12 sẽ không biên dịch vì không có phiên bản nào của phương thức crunch() nhận vào tham số kiểu char. Mặc dù `char` có thể widening conversion sang `int`, nhưng lỗi cú pháp ở dòng 11 sẽ ngăn chương trình biên dịch.





