Khi làm việc với Java, một trong những khái niệm cực kỳ cơ bản nhưng rất quan trọng không thể không biết đó chính là overload và override. Tuy cơ bản, nhưng đây là những kiến thức được hỏi trong những lần phỏng vấn của các nhà tuyển dụng Java. Các câu hỏi như “Phân biệt overload và override?“, “lúc nào thì sử dụng overload và override?“. Bất ngờ khi tôi hỏi một số bạn lập trình Java có kinh nghiệm 1 năm với những câu hỏi trên, các bạn ấy trả lời chưa được chính xác cũng như chưa được nhưng các bạn ấy lại làm được. Nghĩa là làm được nhưng chưa hiểu bản chất. Trong bài này, tôi sẽ trả lời 2 câu hỏi ở đề bài để các bạn tiện theo dõi và tham khảo.
Để làm rõ 2 vấn đề trên, các bạn cần nắm hai khái niệm overload và override là gì trước rồi mới tiếp tục tìm hiểu tiếp.
Overload và Override là gì?
Overload (nạp chồng) là hai phương thức cùng tên nhưng số lượng tham số trong các phương thức khác nhau hoặc các loại dữ liệu của tham số khác nhau và nằm trong một class.
Override (ghì đè) là hai phương thức có cùng tên, cùng kiểu dữ liệu trả về, cùng phạm vi truy cập (Access Modifie) nằm ở hai class khác nhau.
Qua hai khái niệm trên thì các bạn cũng đã hiểu về sự khác biệt của Overload và Override. Để các bạn hiểu rõ hơn chúng ta sẽ xem ví dụ ở bên dưới:
Ví dụ về Overload
1234567891011 | class DisplayOverloading{ public void disp(char c) { System.out.println(c); } public void disp(char c, int num) { System.out.println(c + ” “+num); }} |
Ví dụ về Override
Tạo class Animal
12345678 | public class Animal { public static void testClassMethod() { System.out.println(“The static method in Animal”); } public void testInstanceMethod() { System.out.println(“The instance method in Animal”); }} |
Ta có class Cat kế thừa từ class cha là Animal
123456789101112131415 | public class Cat extends Animal { public static void testClassMethod() { System.out.println(“The static method in Cat”); } public void testInstanceMethod() { System.out.println(“The instance method in Cat”); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); }} |
Kế thừa là gì thì các bạn có thể tìm hiểu thêm nếu chưa biết, trong bài này tôi đang nói cụ thể cho các bạn hiểu về overload cũng như override trong Java. Cách sử dụng thì như hai ví dụ trên, tuy nhiên bây giờ tôi sẽ trả lời câu hỏi đó là…
Lúc nào thì sử dụng overload và override?
- Sử dụng overload khi trong cùng một phương thức, chúng ta muốn làm thêm một công việc khác, ta sẽ dùng Overload.
- Sử dụng override khi trong cùng phương thức , chúng ta lại muốn làm khác đi ta sẽ dùng Override. (Khác đi ở đây là khác phần thân của method, chúng ta có thể sử dụng logic…)
Để các bạn thật dễ hiểu hơn nữa tôi sẽ lấy làm một ví dụ như sau:
Đầu tiên tôi nói về ví dụ hiểu về overload như thế nào:
Giả sử bạn có 1 method dùng để connect đến n database server, theo lẽ thông thường thì bạn sẽ viết ra n method phục vụ việc kết nối ví dụ như :
- connectDBSQL
- connectDBOracle
- connectDBMySSQL
- …
Như các bạn thấy rằng, nếu có n db server thì chúng ta phải viết n method để connect. Làm như vậy sẽ có nhiều hạn chế, thay vì thế bạn sử dụng kỹ thuật overload để chỉ cần viết method có tên là connectDB với các tham số truyền vào tương ứng.
=> Điều này sẽ giúp phương thức của chúng ta tránh nhầm lẫn, có ý nghĩa và dễ nhớ.
Override được hiểu và sử dụng trong trường hợp nào?
Giả sử như tôi có một bài toán như sau: Tính lương của công ty A, lương bằng số ngày * 300000;
Như vậy tôi cần tạo class như sau:
123456 | public class LuongNVCongTyA { public double luongNV(int soNgay){ return soNgay*300000; }} |
Nhưng bay giờ, lương nhân viên của công ty B lại khác so với công ty A rằng lương được tính như sau: lương = soNgay* 200000 + 1000000.
Như vậy với bài toán này, thay vì chúng ta tạo mới một phương thức để tính và xử lý tính lương thì chúng ta sẽ kế thừa lại class LuongNVCongTyA và sau đó override lại phương thức luongNV, code sẽ như sau:
123456 | public class LuongNVCongTyB extends LuongNVCongTyB { public double luongNV(int soNgay){ return soNgay*200000 + 1000000; }} |
Qua đó các bạn thấy rằng, trong cùng một phương thức nhưng chúng ta muốn khác đi, với bài trên chúng ta đều có phương thức tính lương, nhưng mỗi công ty lại có cách tính riêng, nên chúng ta sẽ sử dụng override.
Với các trường hợp ví dụ trên, Overload ,Override không có nghĩa là làm code ngắn hơn, nó chỉ làm cho tên hàm của chúng ta có ý nghĩa và rõ ràng hơn.
Qua bài này, hy vọng các bạn nắm được các khái niệm cũng như đã phân biệt được overload và override trong Java. Ý nghĩa và sử dụng khi nào tôi cũng đã trình bình như trên. Chúc các bạn thực hiện thành công!