OVERRIDE MODIFIER

     

Trong bài viết này, bản thân sẽ trình bày về Override, overload cùng sự khác biệt cơ bản giữa chúng.

Bạn đang xem: Override modifier

1. Override

1.1 tư tưởng và ví dụ:

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

Override được áp dụng để thu được tính đa hình tại runtime.

Ví dụ về sử dụng Override

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

*

Tuy nhiên các loài động vật hoang dã trên lại có thức ăn và music phát ra khác nhau, vậy bắt buộc ta yêu cầu để eat() cùng makeNoise() được thiết lập đè tại từng lớp con:

*

Ta sẽ liên tiếp phân nhóm mịn rộng cây thừa kế trên. Chó sói và chó tất cả họ mặt hàng gần, thuộc thuộc bọn họ Chó (canine), chúng thường dịch chuyển theo bạn bè đàn nên rất có thể dùng chung phương thức roam(). Mèo, hổ, sư tử thuộc thuộc chúng ta Mèo (feline) khi dịch chuyển chúng hay tránh đồng loại nên có thể dùng thông thường phương thức roam(). Trâu nước sẽ thường xuyên dùng cách làm roam() từ bỏ animal.

*

Vậy khi download đè, phương thức nào được gọi?

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

*

1.2 gọi phiên bạn dạng phương thức của lớp cha

Có nhiều trường thích hợp khi thiết lập đè 1 hành vi của lớp cha, nhưng ta lại không muốn thay thế trọn vẹn mà chỉ muốn bổ sung cập nhật một số bỏ ra tiết.Ví dụ: Chẳng hạn, lớp Account thay mặt đại diện cho tài khoản ngân hàng chung chung. Nó cung ứng phương thức withdraw(double) với tính năng rút tiền, phương thức này tiến hành quy trình rút tiền cơ bản: trừ số chi phí rút ngoài số dư tài khoản (balance). FeeBasedAccount là các loại tài khoản ngân hàng 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 chi phí cơ bản, nó còn làm thêm một câu hỏi là trừ giá thành rút tiền ngoài số dư tài khoản. Như vậy, FeeBasedAccount bao gồm cần đến văn bản của phiên bản withdraw() được Account cung cấp sẵn, mà lại vẫn buộc phải cài đè vì chưng nội dung đó cảm thấy không được dùng. Ta cũng không muốn chép nội dung bạn dạng withdraw() của account vào bạn dạng của FeeBasedAccount. Nuốm vào đó, ta mong có phương pháp gọi thủ tục withdraw() của tài khoản từ trong phiên bản cài đè trên FeeBasedAccount.Cách giải quyết: từ trong phiên bạn dạng cài đè tại lớp con, ta hy vọng gọi đến chính phương thức kia của lớp cha, tự khóa super cho phép gọi đến biện pháp thành viên được thừa kế.

public class account 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 việc cài đè

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

2.1 tư tưởng và ví dụ

Nạp ông xã phương thức đơn giản và dễ dàng là tất cả vài cách thức trùng tên nhưng khác nhau về đối số trong thuộc 1 class. Cài chồng phương thức được cho phép ta tạo những phiên bạn dạng của một phương thức, từng phiên bạn dạng chấp dìm một danh sách đối số khác nhau, nhằm mục tiêu tạo thuận tiện cho việc gọi phương thức.Nạp ông chồng phương thức được sử 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 đổi khác 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 phong cách trong nạp chồng

Kiểu tài liệu của đối số truyền vào được chuyển đổi sang kiểu dữ liệu khác (tự cồn ép kiểu) nếu cực hiếm của đối số đó không tương xứng với kiểu dữ liệu của tham số đã được đinh nghĩa.Ví dụ thủ tục sum(int x, double y) sinh sống ví dụ trên lúc được truyền tham số như sau sum(10, 20) thì quý giá tham số thứ hai được truyền vào là int sẽ được auto ép kiểu sang giao diện double.Quy tắc ép kiểu: Được tự động hóa ép về vẻ bên ngoài dữ liệu to hơn và ưu tiên gần nhất kiểu tài liệu được ép theo lắp thêm tự hình sau:
*
Theo hình trên thì mẫu mã byte rất có thể ép sang những kiểu to hơn nó như short, int, float, long, double tuy thế nó sẽ ưu tiên kiểu short. Hoặc kiểu dáng int rất có thể ép sang vẻ bên ngoài float, long, double nhưng nó đang ưu tiên xay sang phong cách long vày long gần nó rộng so cùng với 2 loại 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 vẫn là "Second method will be call" tức là hàm sum vật dụng 2 sẽ được gọi do tham số truyền vào là giao diện int, nó sẽ ưu tiên ép sang kiểu lớn hơn nó và có giá trị sớm nhất nó, ở đó là kiểu long.Từ kia ta bao gồm ta rất có thể suy ra là mẫu mã double ko thể tự động hóa ép kiểu.

2.4 Nạp ck 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 chồng với vận động khởi chế tạo ra giống nhau với chỉ không giống nhau ở phần xử lý các kiểu đối số. Ta sẽ không muốn chép đi chép lại phần mã khởi tạo ra mà những hàm khởi tạo đa số có.Cách giải quyết: ta đã đặt toàn thể phần mã đó vào chỉ một trong những hàm khởi tạo. Và ta mong muốn rằng hàm khởi tạo nào cũng đều call đến hàm khởi tạo thành kia nhằm nó hoàn thành quá trình khởi tạo. Để thao tác đó, ta sử dụng this() để hotline một hàm khởi tạo thành từ bên trong một hàm khởi tạo nên khác của và một lớp. Ví dụ: public class Student int id; String name; Student() System.out.println("gọi Constructor mang định"); Student(int id, String name) this(); // nó được áp dụng để hotline Constructor của lớp hiện tại 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 vẫn là:gọi Contructor khoác địnhgọi Contructor mang định111 Việt222 Nam

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

Các cách tiến hành overloaded bắt buộc cùng tên nhưng khác nhau ở những tham số.Chúng hoàn toàn có thể được định nghĩa cùng hoặc không giống kiểu tài liệu trả về.Chúng hoàn toàn có thể được có mang cùng hoặc khác access modifier.Các cách làm không được call là overloaded nếu bọn chúng chỉ khác nhau ở kiểu dữ liệu trả về hoặc access modifier.3. Sự khác nhau giữa overload và overrideOverrideOverload
Hành viThay đổi hành vi bây giờ của phương thức.Thêm hoặc không ngừng mở rộng cho hành vi của phương thức.

Xem thêm: 3 Cách Tra Cứu Giá Trị Sử Dụng Thẻ Bảo Hiểm Y Tế Online, Tra Cứu Giá Trị Sử Dụng Thẻ Bhyt

Đa hìnhThể hiện tính nhiều hình trên run time.Thể hiện tính đa hình trên compile time.
Danh sách tham sốDanh sách tham số phải giống nhau.Danh sách tham số rất có thể khác nhau.
Quyền truy cậpPhương thức ghi đè nghỉ ngơi lớp con phải gồm quyền truy vấn bằng hoặc lớn hơn phương thức được ghi đè sinh hoạt lớp cha.Các cách tiến hành nạp ông xã có thể tất cả quyền truy cập khác nhau.
Giá trị trả vềKiểu trả về sẽ phải giống nhau.Kiểu trả về có thể khác nhau.

Xem thêm: Top 30 Lịch Sử 10 Bài 20 Violet 2022, Please Wait

Phạm viXảy ra thân 2 class có 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 mình đã ra mắt về override, overload với sự biệt lập giữa chúng, hi vọng sẽ giúp ích rất nhiều cho chúng ta đọc bài viết này. Nội dung bài viết trên nếu tất cả thiếu xót gì mong các bạn góp ý cho chính mình dưới phần comment, mình vẫn sửa lại để nội dung bài viết có nội dung xuất sắc hơn. Cảm ơn chúng ta đã đọc bài bác viết!