Trong Java, nạp chồng phương thức và ghi đè phương thức đều đề cập đến việc tạo các phương thức khác nhau có cùng tên.
Mặc dù hai khái niệm có một số điểm tương đồng, nhưng chúng là những khái niệm riêng biệt với các trường hợp sử dụng khác nhau rõ rệt. Nắm vững chúng là điều quan trọng trong việc xây dựng các kỹ năng Java nền tảng vững chắc.
Trong bài đăng này, chúng ta sẽ khám phá các quy tắc chính của nạp chồng và ghi đè phương thức, cũng như sự khác biệt giữa chúng.
Nạp chồng phương thức trong Java là gì?
Nạp chồng một phương thức, nói một cách đơn giản, có nghĩa là tạo một phương thức khác có cùng tên trong cùng một lớp, nhưng với một danh sách tham số khác.
Có thể có nhiều trường hợp bạn cần xử lý các loại đầu vào khác nhau cho cùng một thao tác và nạp chồng phương thức là một cách để xử lý các trường hợp đó.
Ví dụ: giả sử bạn muốn tạo một phương thức thực hiện phép cộng hai số. Phép tính này được thiết kế để trả về một số làm đầu ra. Nếu phương thức của bạn xử lý các tham số kiểu int
, việc cố gắng gọi nó bằng cách chuyển các giá trị kiểu double
làm đối số sẽ dẫn đến lỗi biên dịch.
Vì lý do này, bạn có thể muốn làm quá tải phương thức bằng cách tạo một phiên bản mới của phương thức đó có khả năng xử lý một loại đầu vào khác (trong trường hợp này là type double
):
public class Calculator {
public int sum(int a, int b) {
return a + b;
}
public double sum(double a, double b) {
return a + b;
}
}
Trong ví dụ trên, sum()
phương thức bị quá tải vì nó được định nghĩa nhiều lần trong cùng một lớp, nhưng với một danh sách tham số khác.
Một phương thức cũng có thể bị quá tải bằng cách thay đổi số lượng tham số. Trên cơ sở này, các phương thức sau đây cũng là các ví dụ hợp pháp về cách sum()
phương thức có thể được nạp chồng, giả sử chúng được đặt trong cùng một lớp:
public int sum(int a, int b, int c) {
return a + b + c;
}
protected void sum() {
System.out.print("Nothing to sum");
}
Lưu ý rằng, như trong một số ví dụ ở trên, bạn cũng có thể thay đổi kiểu trả về hoặc công cụ sửa đổi quyền truy cập nhưng điều này không bắt buộc.
Các quy tắc chính của quá tải phương thức
Hãy nhớ các quy tắc này khi quá tải một phương thức:
- Các phương thức nạp chồng và nạp chồng phải nằm trong cùng một lớp (Lưu ý: điều này bao gồm bất kỳ phương thức nào được kế thừa, thậm chí ngầm, từ một lớp cha).
- Các tham số phương thức phải thay đổi: số lượng hoặc loại tham số phải khác nhau trong hai phương thức.
- Kiểu trả về có thể được sửa đổi tự do.
- Công cụ sửa đổi truy cập (
public
,private
, v.v.) có thể được sửa đổi tự do. - Các ngoại lệ bị ném, nếu có, có thể được sửa đổi tự do.
Ghi đè phương thức trong Java là gì?
Ghi đè phương thức đề cập đến việc xác định lại một phương thức trong lớp con đã tồn tại trong lớp cha.
Khi bạn gọi một phương thức bị ghi đè bằng cách sử dụng một đối tượng thuộc loại lớp con, Java sẽ sử dụng cách triển khai của phương thức đó trong lớp con chứ không phải trong lớp cha. Vì lý do này, sự hiểu biết về khái niệm kế thừa trong Java là rất quan trọng để nắm bắt tốt về ghi đè phương thức.
Bất kỳ lớp con nào thường có thể ghi đè bất kỳ phương thức nào từ lớp cha, trừ khi một phương thức được đánh dấu bằng từ khóa final
hoặc static
. Phương thức ghi đè không được thay đổi tên và danh sách tham số của phương thức ghi đè.
Mặc dù không bắt buộc, nhưng bạn nên sử dụng @Override
chú thích khi ghi đè một phương thức: chú thích này sẽ kiểm tra xem phương thức đó có đang bị ghi đè đúng cách hay không và sẽ cảnh báo bạn nếu không đúng như vậy.
Trong ví dụ sau, bạn sẽ thấy một lớp Car
mở rộng lớp Vehicle
. Lớp Car
ghi đè move()
phương thức từ lớp cha và điều này được làm rõ bằng cách sử dụng chú @Override
thích. Hai phương thức được triển khai khác nhau trong phần thân phương thức.
class Vehicle {
public void move() {
System.out.println("The vehicle is moving");
}
}
class Car extends Vehicle {
@Override
public void move() {
System.out.println("The car is moving");
}
}
Việc lựa chọn phiên bản nào move()
sẽ được gọi dựa trên loại đối tượng mà phương thức đang được gọi. Lưu ý rằng phiên bản của phương thức bị ghi đè được gọi được xác định trong thời gian chạy và dựa trên loại đối tượng, không phải tham chiếu đối tượng.
Điều này được minh họa trong ví dụ sau, cụ thể là trong lệnh gọi thứ ba tới move()
: trong khi phương thức được gọi trên một tham chiếu đối tượng thuộc loại Vehicle
, thì đối tượng thực sự thuộc loại Car
. Loại đối tượng ở đây được xác định trong thời gian chạy và do đó, phiên bản của phương thức được gọi là phiên bản từ lớp Car
con.
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.move(); // Prints: The vehicle is moving
Car car = new Car();
car.move(); // Prints: The car is moving
Vehicle secondVehicle = new Car();
secondVehicle.move(); // Prints: The car is moving
}
Các quy tắc chính của ghi đè phương thức
Hãy nhớ các quy tắc này khi ghi đè một phương thức:
- Danh sách tham số không được thay đổi: phương thức ghi đè phải có cùng số lượng và loại tham số như phương thức ghi đè – nếu không, bạn sẽ chỉ làm quá tải phương thức.
- Kiểu trả về không được thay đổi (Lưu ý: nếu phương thức trả về một đối tượng, một lớp con của đối tượng đó được phép làm kiểu trả về).
- Công cụ sửa đổi truy cập phải giống hoặc ít hạn chế hơn (ví dụ: nếu phương thức được ghi đè là
protected
, bạn có thể khai báo phương thức ghi đè làpublic
, nhưng không được khai báoprivate
). - Các ngoại lệ được kiểm tra đã ném, nếu có, có thể được loại bỏ hoặc giảm bớt bằng phương pháp ghi đè. Điều này có nghĩa là phương thức ghi đè có thể ném ngoại lệ được kiểm tra giống như phương thức bị ghi đè hoặc lớp con của ngoại lệ được kiểm tra đó, nhưng không phải là ngoại lệ rộng hơn. Hạn chế này không áp dụng cho các trường hợp ngoại lệ không được kiểm tra.
Phần kết luận
Trong bài viết này, chúng ta đã khám phá các quy tắc chính của nạp chồng phương thức và ghi đè phương thức trong Java. Bạn đã thấy rằng điểm chính của quá tải một phương thức là thay đổi danh sách tham số của nó để thực hiện một hành vi khác dựa trên các đối số được truyền cho nó.
Mặt khác, ghi đè đề cập đến việc xác định lại cùng một phương thức, với cùng một danh sách tham số, trong một lớp con để điều chỉnh hành vi của nó theo nhu cầu của lớp con.
Các khái niệm này được liên kết với một số ý tưởng lập trình hướng đối tượng cốt lõi, chẳng hạn như tính kế thừa và tính đa hình, vì vậy chúng là nền tảng để thành thạo Java. Chúng có thể gây ra một số nhầm lẫn, đặc biệt là đối với người mới bắt đầu, nhưng hiểu rõ về các quy tắc và cách sử dụng các khái niệm này sẽ giúp các nhà phát triển viết mã hiệu quả hơn và dễ đọc hơn.
Nếu bạn muốn đọc bất kỳ bài viết nào khác của tôi, bạn có thể xem blog của tôi .