Ta đã học về “nạp chồng” ở các chương trước. Tuy nhiên thuật ngữ tiếng Anh của nó, overloading
thường hay bị nhầm lẫn với một thuật ngữ khác là overriding
– cài đè. Vậy trước tiên hãy đi vào định nghĩa của chúng.
Cài đè một phương thức nói tới việc cung cấp cách triển khai mới cho một phương thức mà đã được triển khai ở lớp cha. Để cài đè một phương thức, phương thức đó phải được định nghĩa vào lớp con với cùng một bộ nhận diện (tên, bộ tham số, kiểu trả về) với phương thức ở lớp cha.
Nạp chồng nói tới việc định nghĩa ra nhiều phương thức với cùng tên nhưng không có cùng bộ nhận diện.
Chúng ta hãy xem xét hai ví dụ sau đây, trong ví dụ đầu tiên, class A
cài đè phương thức p(double number)
của lớp cha. Trong ví dụ thứ hai, class A
thay vì cài đè, nó nạp chồng bằng phương thức p(int number)
.
Trong cả hai trường hợp, mã đều được kiểm thử bằng cách gọi phương thức p
với hai đối số: một là số nguyên và một là số thực.
Ví dụ một:
public class Test { public static void main(String[] args) { A a = new A(); a.p(10); a.p(10.0); } } class A extends B { public void p(double number) { System.out.println(number); } } class B { public void p(double number) { System.out.println(number * 2); } }
Ví dụ hai:
public class Test { public static void main(String[] args) { A a = new A(); a.p(10); a.p(10.0); } } class A extends B { public void p(int number) { System.out.println(number); } } class B { public void p(double number) { System.out.println(number * 2); } }
Hãy đọc và dịch lần lượt từng ví dụ một để phán đoán kết quả.
Cái chú thích @Override
ấy có tác dụng gì
Khi bạn định nghĩa phương thức cài đè một cách có chủ ý, hãy chủ động sử dụng chú thích @Override
. Ví dụ:
public class Circle extends Geometric { // những mã khác của lớp Circle không được viết vào đây @Override public String toString() { return super.toString() + " and radius is " + radius; } }
Nó không bổ sung chức năng gì vào phương thức cài đè cả, nhưng nó sẽ đặt hạn chế để nếu phương thức bạn viết ra không hề cài đè phương thức nào ở lớp cha cả (ví dụ do bạn viết nhầm tên, tostring
thay vì toString
chẳng hạn), trình biên dịch sẽ báo lỗi (mặc dù thực sự không có lỗi nào).
Khi viết phương thức cài đè, hãy sử dụng chú thích @Override
.