Trong bài viết này, mình sẽ trình bày về Override, overload và sự không giống nhau cơ phiên bản giữa chúng.

Bạn đang xem: Overriding là gì

1. Override

1.1 quan niệm và ví dụ:

Override là một trong tính năng cho phép một lớp con cung cấp một triển khai ví dụ của thủ tục đã được cung cấp bởi một trong những lớp thân phụ của nó. Nói dễ nắm bắt hơn, giả dụ lớp con có một hoặc những phương thức như thể với một trong những lớp thân phụ của nó, thì sẽ là ghi đè phương thức.

Override được sử dụng để thu được tính đa hình trên runtime.

Ví dụ về áp dụng Override

Ta sẽ xây dựng 1 cây kế thừa cho những loài động vật như hình dưới, những loài động vật hoang dã này đều phải sở hữu chung các đặc điểm và phương thức như:picture – tên file hình ảnh đại diện cho loài vật nàyfood – các loại thức nạp năng lượng mà loài vật thích. Hiện tại giờ, đổi thay này chỉ gồm hai giá bán trị: cỏ (grass) hoặc giết mổ (meat).hunger – một biến int trình diễn mức độ đói của bé vật. Thay đổi này biến đổi tùy theo khi nào con vật ăn và nó nạp năng lượng bao nhiêu.boundaries – các giá trị trình diễn chiều dọc và chiều ngang (ví dụ 640 x 480) của khu vực mà các con vật sẽ đi lại chuyển động trong đó.location – những tọa độ X và Y của con vật trong quanh vùng của nó.makeNoise() – hành động khi loài vật phát ra tiếng kêu.eat() – hành vi khi bé vật gặp nguồn thức ăn ưa thích, giết thịt hoặc cỏ.sleep() – hành động khi loài vật được coi là đang ngủ.roam() – hành vi khi bé vật chưa phải đang ăn uống hay đang ngủ, có thể chỉ đi lang thang đợi chạm mặt món gì ăn uống được hoặc gặp gỡ biên giới lãnh địa.

*

Tuy nhiên các loài động vật trên lại sở hữu thức ăn uống và âm nhạc phát ra khác nhau, vậy nên ta cần để eat() cùng makeNoise() được cài đè trên từng lớp con:

*

Ta sẽ liên tục phân team mịn hơn cây kế thừa trên. Chó sói và chó gồm họ hàng gần, thuộc thuộc chúng ta Chó (canine), chúng thường di chuyển theo bè cánh đàn nên hoàn toàn có thể dùng phổ biến phương thức roam(). Mèo, hổ, sư tử thuộc thuộc bọn họ Mèo (feline) khi di chuyển chúng hay tránh đồng các loại nên có thể dùng thông thường phương thức roam(). Hà mã sẽ tiếp tục dùng cách tiến hành roam() từ bỏ animal.

*

Vậy khi cài đặt đè, thủ tục nào được gọi?

Trong cây kế thừa xảy ra cài đè, cái gì ở thấp nhất sẽ tiến hành gọi.Lấy ví dụ sinh hoạt hình trên, lớp Wolf gồm bốn phương thức: sleep() được quá kế từ Animal, roam() được thừa kế tự Canine (thực ra là phiên phiên bản đè bạn dạng của Animal), và hai thủ tục mà Wolf mua đè bản của Animal - makeNoise() cùng eat(). Những phương thức sẽ được gọi như sau:

*

1.2 điện thoại tư vấn phiên bản phương thức của lớp cha

Có những trường đúng theo khi thiết lập đè 1 hành vi của lớp cha, tuy nhiên ta lại không thích thay thế hoàn toàn mà chỉ muốn bổ sung một số đưa ra tiết.Ví dụ: Chẳng hạn, lớp Account đại diện cho tài khoản ngân hàng chung chung. Nó hỗ trợ phương thức withdraw(double) với tác dụng rút tiền, cách làm này thực hiện quy trình rút chi phí cơ bản: trừ số tiền rút khỏi số dư thông tin tài khoản (balance). FeeBasedAccount là một số loại tài khoản bank thu phí so với mỗi lần rút tiền, nghĩa là ở bên cạnh quy trình rút tiền cơ bản, nó còn hỗ trợ thêm một bài toán là trừ giá thành rút tiền ngoài số dư tài khoản. Như vậy, FeeBasedAccount gồm cần đến câu chữ của phiên bản withdraw() được Account cung ứng sẵn, tuy nhiên vẫn yêu cầu cài đè vày nội dung đó không đủ dùng. Ta cũng không thích chép nội dung bạn dạng withdraw() của account vào bạn dạng của FeeBasedAccount. Thế vào đó, ta ý muốn có giải pháp gọi cách làm withdraw() của tài khoản từ trong phiên phiên bản cài đè tại FeeBasedAccount.Cách giải quyết: từ vào phiên bản cài đè trên lớp con, ta muốn gọi đến bao gồm phương thức đó của lớp cha, từ khóa super có thể chấp nhận được gọi đến giải pháp thành viên được vượt kế.

public class trương mục private double balance = 0; public void deposit(double money) balance += money; public void wirhDraw(double money) balance -= money; public class FeeBasedAcount extends trương mục private double fee = 10; public void withdraw(double money) super.wirhDraw(money); balance -= fee;

1.3 những quy tắc cho câu hỏi cài đè

Danh sách tham số phải trùng nhau, kiểu quý giá trả về phải tương thích.Phương thức đè không được giảm quyền truy nhập so với phiên phiên bản của lớp cha.Nói phương pháp khác, quyền truy vấn nhập nhưng mà phiên bản của lớp con có thể chấp nhận được phải bởi hoặc rộng hơn phiên bạn dạng của lớp cha. Ta ko thể cài đè một thủ tục public bởi một phiên bản private. Nếu như không, trường hợp xảy ra là 1 trong những lời gọi cách làm đã được trình biên dịch gật đầu đồng ý vì tưởng là cách thức public nhưng cho đến khi nó chạy lại bị đồ vật ảo khước từ vì phiên phiên bản được hotline lại là private.Phải là quan hệ nam nữ IS-A (kế thừa).Các cách làm final, static, private ko thể sở hữu đè.2. Overload

2.1 quan niệm và ví dụ

Nạp ông xã phương thức dễ dàng là tất cả vài phương thức trùng tên nhưng khác nhau về đối số trong cùng 1 class. Cài chồng phương thức có thể chấp nhận được ta tạo những phiên phiên bản của một phương thức, từng phiên bản chấp nhận một list đối số không giống nhau, nhằm mục tiêu tạo thuận tiện cho bài toán gọi phương thức.Nạp ông xã phương thức được áp dụng để nhận được tinh đa hình trên compile time.Ví dụ: class Calculation void sum(int a, int b) System.out.println(a + b); void sum(int a, int b, int c) System.out.println(a + b + c);

2.2 các cách hấp thụ chồng

2.2.1 chuyển đổi số lượng tham số

Ví dụ:

class Sum void sum(int a, int b) System.out.println(a + b); void sum(int a, int b, int c) System.out.println(a + b + c); 2.2.2 đổi khác kiểu trả về của tham số

Ví dụ:

class Sum void sum(int a, int b) System.out.println(a + b); void sum(int a, double b) System.out.println(a + b);

2.3 tự động ép giao diện trong hấp thụ chồng

Kiểu dữ liệu của đối số truyền vào được biến đổi sang kiểu tài liệu khác (tự cồn ép kiểu) nếu quý hiếm của đối số kia không cân xứng với kiểu dữ liệu của tham số đã làm được đinh nghĩa.Ví dụ cách thức sum(int x, double y) nghỉ ngơi ví dụ trên khi được truyền thông số như sau sum(10, 20) thì quý hiếm tham số thứ 2 được truyền vào là int vẫn được auto ép kiểu sang mẫu mã double.Quy tắc xay kiểu: Được auto ép về hình dạng dữ liệu to hơn và ưu tiên gần nhất kiểu dữ liệu được nghiền theo sản phẩm tự hình sau:
*
Theo hình trên thì mẫu mã byte hoàn toàn có thể ép sang những kiểu lớn hơn nó như short, int, float, long, double tuy vậy nó đang ưu tiên phong cách short. Hoặc hình dáng int có thể ép sang thứ hạng float, long, double tuy vậy nó vẫn ưu tiên ép sang hình dáng long vì long ngay sát nó rộng so với 2 hình dáng còn lại. Ví dụ: class Sum void sum(float a, float b) System.out.println("First method will be call"); void sum(long a, long b) System.out.println("Second method will be call"); public static void main(String<> args) Sum s = new Sum(); s.sum(10, 20); Kết trái in ra đã là "Second method will be call" tức là hàm sum trang bị 2 sẽ được gọi vì chưng tham số truyền vào là hình dạng int, nó vẫn ưu tiên ép sang kiểu lớn hơn nó và có giá trị gần nhất nó, ở đó là kiểu long.Từ đó ta có ta hoàn toàn có thể suy ra là hình dáng double ko thể auto ép kiểu.

2.4 Nạp chồng phương thức khởi tạo

Xét trường thích hợp ta có những hàm khởi tạo ông chồng với hoạt động khởi chế tạo ra giống nhau và chỉ khác nhau ở phần xử lý các kiểu đối số. Ta sẽ không còn muốn chép đi chép lại phần mã khởi sản xuất mà những hàm khởi tạo phần lớn có.Cách giải quyết: ta đang đặt toàn cục phần mã kia vào chỉ một trong số hàm khởi tạo. Với ta muốn rằng hàm khởi tạo nào thì cũng đều call đến hàm khởi tạo nên kia nhằm nó trả thành công việc khởi tạo. Để thao tác đó, ta sử dụng this() để gọi một hàm khởi tạo thành từ bên trong một hàm khởi tạo ra khác của cùng một lớp. Ví dụ: public class Student int id; String name; Student() System.out.println("gọi Constructor khoác định"); Student(int id, String name) this(); // nó được sử dụng để gọi Constructor của lớp lúc này this.id = id; this.name = name; void display() System.out.println(id + " " + name); public static void main(String args<>) Student e1 = new Student(111, "Viet"); Student e2 = new Student(222, "Nam"); e1.display(); e2.display(); Kết quả in ra đang là:gọi Contructor mặc địnhgọi Contructor mặc định111 Việt222 Nam

2.5 những quy tắc hấp thụ chồng

Các phương thức overloaded cần cùng thương hiệu nhưng khác biệt ở những tham số.Chúng rất có thể được tư tưởng cùng hoặc khác kiểu tài liệu trả về.Chúng có thể được định nghĩa cùng hoặc không giống access modifier.Các cách thức không được điện thoại tư vấn là overloaded nếu bọn chúng chỉ khác biệt ở kiểu tài liệu trả về hoặc access modifier.3. Sự khác nhau giữa overload với overrideOverrideOverload
Hành viThay đổi hành vi lúc này của phương thức.Thêm hoặc mở rộng cho hành động của phương thức.
Đa hìnhThể hiện tính nhiều hình trên run time.Thể hiện tính nhiều hình tại compile time.
Danh sách tham sốDanh sách tham số nên giống nhau.Danh sách tham số rất có thể khác nhau.
Quyền truy nã cậpPhương thức ghi đè ở lớp nhỏ phải có quyền truy vấn bằng hoặc lớn hơn phương thức được ghi đè sống lớp cha.Các phương thức nạp chồng có thể có quyền truy vấn khác nhau.
Giá trị trả vềKiểu trả về bắt buộc phải giống nhau.Kiểu trả về hoàn toàn có thể khác nhau.

Xem thêm: Từ Điển Anh Việt " Reaper Là Gì, (Từ Điển Anh Nghĩa Của Từ Reaper Trong

Phạm viXảy ra thân 2 class bao gồm quan hệ kế thừaXảy ra trong phạm vi thuộc 1 class.
4. Tổng kếtBài viết trên bản thân đã ra mắt về override, overload với sự khác hoàn toàn giữa chúng, hi vọng để giúp đỡ ích ít nhiều cho chúng ta đọc nội dung bài viết này. Nội dung bài viết trên nếu bao gồm thiếu xót gì mong các bạn góp ý cho khách hàng dưới phần comment, mình sẽ sửa lại để bài viết có nội dung xuất sắc hơn. Cảm ơn các bạn đã đọc bài xích viết!