
Overriding và Overloading là những khái niệm cốt lõi trong lập trình Java. Đây là những cách để triển khai polymorphism (tính đa dạng) trong các chương trình Java của chúng ta. Tính đa dạng là một trong những khái niệm thuộc OOP.

Ảnh chụp màn hình Java code với các mũi tên chỉ vào những vị trí xảy ra overloading và overriding.
Khi method signature (tên và tham số) giống nhau trong superclass (siêu lớp) và child class (lớp con), thì gọi là overriding (sự ưu tiên). Khi có từ hai method trở lên trong cùng một class có cùng tên nhưng khác tham số, thì gọi là sự quá tải.
So sánh Overriding và Overloading
| Overriding | Overloading |
|---|---|
| Triển khai “runtime polymorphism” | Triển khai “compile time polymorphism” |
| Lời gọi method được xác định tại runtime dựa trên loại object | Lời gọi method được xác định tại compile time |
| Xảy ra giữa superclass và subclass | Xảy ra giữa các method trong cùng một class |
| Có cùng signature (tên và danh sách tham số) | Có cùng tên nhưng tham số khác nhau |
| Nếu có lỗi, tác động sẽ xuất hiện ở runtime | Nếu có lỗi, có thể được phát hiện tại compile time |
Ví dụ về Overriding và Overloading
Đây là phần dịch và trình bày ví dụ minh họa cho Overloading và Overriding trong Java:
package com.journaldev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("Processing two integers:%d, %d", i, j);
}
public void process(int[] ints) {
System.out.println("Adding integer array:" + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("Adding integer array:" + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("Sum of integers is " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("Sum of integer array elements is " + sum);
}
}
Overriding
Method process() với tham số int i, int j trong class Processor được ghi đè trong lớp con MathProcessor. Dòng 7 và dòng 23:
public class Processor {
public void process(int i, int j) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(int i, int j) { /* ... */ }
}
Và method process() với tham số int[] ints trong class Processor cũng được ****ghi đè ****trong lớp con. Dòng 11 và dòng 28:
public class Processor {
public void process(int[] ints) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(Object[] objs) { /* ... */ }
}
Overloading
Method process() được nạp chồng trong class Processor. Các dòng 7, 11 và 15:
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về overriding và overloading trong Java. Overriding xảy ra khi method signature giống nhau trong siêu lớp và lớp con. Overloading xảy ra khi có từ hai method trở lên trong cùng một class có cùng tên nhưng tham số khác nhau.