Sự khác biệt giữa quá tải một phương thức và ghi đè nó trong Java là gì?


Câu trả lời:


41

Để quá tải một phương thức với một phương thức mới, phương thức mới cần có một chữ ký khác. Tức là hai phương thức quá tải có cùng tên, nhưng tham số khác nhau. Đây là một ví dụ về hai phương thức quá tải:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

Dựa trên các loại tham số, phương thức tương ứng sẽ được gọi. Lưu ý rằng thay đổi loại trả lại là không đủ (mặc dù bạn có thể làm điều này bổ sung).

Khi một phương thức bị ghi đè, thì phương thức mới có cùng chữ ký và thay thế phương thức bị ghi đè trong một số trường hợp. Đây là một ví dụ về một phương thức được ghi đè:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

Sự lựa chọn được thực hiện dựa trên loại đối tượng. Ví dụ,

A someA = new B();
someA.someMethod();

sẽ gọi someMethodcủa B. Bạn có thể (và nên) thêm chú thích @Override:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

Bây giờ, nếu bạn vô tình thay đổi các tham số trong B, trình biên dịch sẽ thông báo cho bạn, rằng bạn không ghi đè một sốMethod () nhưng quá tải nó.


@scarfridge, cảm ơn đã chỉnh sửa. Không được lập trình với Java từ lâu và đã quên rất nhiều)))
superM

1
Cảm ơn bạn đã đề cập đến các chú thích @Override và thực tế là chỉ có các loại trả về khác nhau không gây ra một phương thức để ghi đè, mà thay vào đó là quá tải.
Daniel Dinnyes

13

Quá tải, các phương thức có cùng tên nhưng tham số khác nhau.

Ghi đè, việc thực hiện được đưa ra trong lớp cơ sở được thay thế bằng lớp trong lớp con.


1
xin vui lòng không chỉnh sửa / mở rộng này. Sự ngắn gọn là điểm.
NimChimpsky

7

Các khái niệm bạn hỏi về được trình bày trong các hướng dẫn Java.

Giải thích cho ghi đè được đưa ra như sau:

Một phương thức cá thể trong một lớp con có cùng chữ ký (tên, cộng với số lượng và loại tham số của nó) và kiểu trả về như một phương thức cá thể trong lớp bậc trên ghi đè phương thức của lớp bậc trên.

Khả năng của một lớp con để ghi đè một phương thức cho phép một lớp kế thừa từ một siêu lớp có hành vi "đủ gần" và sau đó sửa đổi hành vi khi cần. Phương thức ghi đè có cùng tên, số và loại tham số và kiểu trả về như phương thức ghi đè. Một phương thức ghi đè cũng có thể trả về một kiểu con của kiểu được trả về bởi phương thức được ghi đè. Đây được gọi là kiểu trả về covariant .

Khi ghi đè một phương thức, bạn có thể muốn sử dụng @Overridechú thích hướng dẫn trình biên dịch mà bạn định ghi đè một phương thức trong lớp cha. Nếu, vì một số lý do, trình biên dịch phát hiện ra rằng phương thức không tồn tại trong một trong các siêu lớp, nó sẽ tạo ra một lỗi. Để biết thêm thông tin về @Override, xem Chú thích ...

Quá tải được giải thích trong hướng dẫn như sau:

Ngôn ngữ lập trình Java hỗ trợ các phương thức nạp chồng và Java có thể phân biệt giữa các phương thức với các chữ ký phương thức khác nhau. Điều này có nghĩa là các phương thức trong một lớp có thể có cùng tên nếu chúng có các danh sách tham số khác nhau (có một số tiêu chuẩn về điều này sẽ được thảo luận trong bài học có tiêu đề "Giao diện và Kế thừa".

Giả sử rằng bạn có một lớp có thể sử dụng thư pháp để vẽ các loại dữ liệu khác nhau (chuỗi, số nguyên, v.v.) và có chứa một phương thức để vẽ từng loại dữ liệu. Đó là rườm rà để sử dụng một cái tên mới cho mỗi phương pháp-ví dụ, drawString, drawInteger, drawFloat, và vân vân. Trong ngôn ngữ lập trình Java, bạn có thể sử dụng cùng tên cho tất cả các phương thức vẽ nhưng truyền một danh sách đối số khác nhau cho mỗi phương thức. Do đó, lớp vẽ dữ liệu có thể khai báo bốn phương thức được đặt tên draw, mỗi phương thức có một danh sách tham số khác nhau ...

Các phương thức quá tải được phân biệt bởi số lượng và loại đối số được truyền vào phương thức ...

Bạn không thể khai báo nhiều hơn một phương thức có cùng tên và cùng số lượng và loại đối số, vì trình biên dịch không thể phân biệt chúng.

Trình biên dịch không xem xét kiểu trả về khi phân biệt các phương thức, vì vậy bạn không thể khai báo hai phương thức có cùng chữ ký ngay cả khi chúng có kiểu trả về khác nhau.


Lưu ý: Các phương thức quá tải nên được sử dụng một cách tiết kiệm, vì chúng có thể làm cho mã ít dễ đọc hơn nhiều.


Giải thích trên cho quá tải đề cập đến trình độ được thảo luận trong bài học có tiêu đề "Giao diện và kế thừa" :

Trong một lớp con, bạn có thể quá tải các phương thức được kế thừa từ lớp cha. Các phương thức quá tải như vậy không che giấu cũng không ghi đè lên các phương thức siêu lớp mà chúng là các phương thức mới, duy nhất cho lớp con.


2

Quá tải một phương thức thường được định nghĩa là "cung cấp nhiều phương thức có sẵn có cùng tên, khác nhau theo số lượng và loại đầu vào và đầu ra". Khái niệm thường là bạn muốn có thể thực hiện cùng một hoạt động cơ bản với các bộ đầu vào khác nhau: ví dụ, bạn có thể "thêm" bất kỳ hai giá trị nào của loại số, tuy nhiên, điều quan trọng là phải biết chính xác loại nào giá trị là để bạn có thể tận dụng hoặc lập kế hoạch cho các hành vi cụ thể của loại đó. Như vậy, bạn sẽ xác định một phương thức cho từng tổ hợp loại số (và hoặc bộ sưu tập) mà bạn muốn hỗ trợ. Tất cả các phương thức này có cùng tên, nhưng "chữ ký" khác nhau; tại thời gian biên dịch,

Ghi đè một phương thức thường được định nghĩa là "cung cấp một triển khai khác trong lớp dẫn xuất của phương thức với một chữ ký cụ thể được xác định trong lớp cơ sở". Có nhiều lý do để ghi đè một phương thức; Hầu như tất cả chúng đều có điểm chung là lớp dẫn xuất có kiến ​​thức bổ sung về những gì phải được thực hiện, mà lớp cơ sở không thể biết được. Có hai hương vị ghi đè trong hầu hết các ngôn ngữ OO; ghi đè có thể thay thế phương thức lớp cơ sở hoặc nó có thể mở rộngphương thức lớp cơ sở. Sự khác biệt thường là một lớp dẫn xuất đang mở rộng một triển khai lớp cơ sở sẽ gọi phiên bản ghi đè của lớp cơ sở tại một thời điểm nào đó trong khi thực hiện phương thức ghi đè. Điều này cho phép ghi đè các lớp để "sử dụng lại" các khu vực chung của hoạt động được chứa trong lớp cơ sở.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.