JavaScript is required

Hãy cho biết kết quả khi chạy đoạn chương trình sau?
class Student {
public int getAge() {
return 10;
}
}
public class Man extends Student {
public int getAge(int added) {
return super.getAge() + added;
}
public static void main(String[] args) {
Man s = new Man();
System.out.println(s.getAge());
System.out.println(s.getAge());
}
}

A.
10 11
B.
10 10
C.

11 11

D.
Không in gì và báo lỗi
Trả lời:

Đáp án đúng: B


Đoạn code định nghĩa một lớp `Student` với phương thức `getAge()` trả về 10. Lớp `Man` kế thừa từ lớp `Student` và định nghĩa một phương thức `getAge(int added)` ghi đè phương thức `getAge()` của lớp cha. Phương thức `getAge(int added)` này trả về tổng của `super.getAge()` (kết quả của phương thức `getAge()` từ lớp cha, tức là 10) và `added`. Tuy nhiên, trong phương thức `main`, chúng ta tạo một đối tượng `s` của lớp `Man` và gọi phương thức `s.getAge()` hai lần. Vì lớp `Man` có một phương thức `getAge(int added)` nhưng không có phương thức `getAge()` không tham số, nên khi gọi `s.getAge()`, nó sẽ không khớp với phương thức nào trong lớp `Man`. Tuy nhiên, Java cho phép kế thừa phương thức từ lớp cha nếu lớp con không định nghĩa phương thức trùng tên (overriding). Do đó, lời gọi `s.getAge()` sẽ gọi phương thức `getAge()` từ lớp `Student`, trả về 10. Việc gọi hai lần sẽ in ra 10 hai lần.

Câu hỏi liên quan