Cài đè và nạp chồng

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.

Bài viết liên quan

Leave a Reply

Your email address will not be published.