Bạn đang xem bài viết Java Bài 29: Nạp Chồng Phương Thức (Overloading) được cập nhật mới nhất trên website Channuoithuy.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
Rate this item:
Rating: 5.0/5. From 36 votes.
Please wait…
Chào mừng các bạn đã đến với bài học Java số 29. Bài học về Nạp chồng phương thức (Overloading). Đây là bài học trong chuỗi bài về lập trình ngôn ngữ Java của Yellow Code Books.
Nếu bạn nhớ, chúng ta đã học về overriding. Hôm nay bạn lại được biết thêm về overloading. Cẩn thận coi chừng nhầm lẫn nha bạn. Overriding, overloading, over, and over…
Mình đùa tí thôi, mình giúp các bạn nhớ lại một tí như sau.
– Overriding là cái sự lớp con ghi đè phương thức của lớp cha. – Overloading là nạp chồng phương thức.
Mời các bạn cùng đến với bài học hôm nay. Bài học sẽ giúp bạn nắm được khái niệm overloading là gì. Bên cạnh đó nó còn giúp bạn đừng bị nhầm lẫn giữa overriding và overloading nữa đấy.
Nạp Chồng Phương Thức (Overloading) Là Gì?
Kỹ thuật overloading làm tăng tính sử dụng cho các phương thức bên trong một lớp.
Bạn thử nhìn vào ví dụ sau đây.
public class HinhTron extends HinhHoc { public void nhapBanKinh() { } public void nhapBanKinh(float banKinh) { } public void nhapBanKinh(float banKinh, int donVi) { } }Như mình có nói trên kia rằng, overloading cho phép bạn khai báo nhiều phương thức trong một lớp có tên trùng nhau, nhưng khác tham số như các phương thức nhapBanKinh ở ví dụ trên.
Đau đầu đúng không. Bạn sẽ quen nhanh thôi khi thao tác nhiều với hai kỹ thuật này.
Nạp Chồng Phương Thức Có Tác Dụng Gì?
Theo như mình thấy. Nếu bạn áp dụng overloading vào một lớp, tức xây dựng nhiều phương thức trùng tên trong một lớp. Nó sẽ không có tác dụng ngay cho lớp đó, chẳng hạn như nó không giúp code của lớp đó gọn gàng, hay rõ ràng hơn để bạn dễ code hay dễ quản lý gì đâu, đôi khi nó gây ra một sự xáo trộn nhất định về mặt tổ chức bên trong lớp đó, nếu như bạn có quá nhiều các phương thức trùng tên.
Nhưng overloading lại phát huy tác dụng rất lớn khi bạn gọi đến chúng từ các lớp khác. Nó làm tăng tính sử dụng của lớp có dùng kỹ thuật overloading.
Mình sẽ cho bạn một dẫn chứng, bạn có nhớ rằng, mỗi khi gọi đến phương thức để in dữ liệu ra console, bạn có thấy rất nhiều tùy chọn đến các phương thức cùng tên hay không. Mời bạn cùng xem các gợi ý cho phương thức println như hình sau.
Bạn thấy đó, với việc sử dụng nhiều phương thức cùng tên println nhưng khác tham số như trên, sẽ làm tăng tính hiệu quả sử dụng của chúng tôi . Khi này thì phương thức println đã “bao sô” hết tất cả các tham số có thể có rồi, do đó bạn có thể yêu cầu phương thức này xuất ra console bất cứ dữ liệu nào mà bạn muốn, nó đều làm được mà không ỏng ẹo gì cả đúng không nào.
Quay lại lớp HinhTron mà bạn vừa thử nghiệm trên kia, nếu như ở đâu đó có khai báo và gọi đến các phương thức nhapBanKinh bên trong lớp này, bạn sẽ thấy sự gợi ý đến ba phương thức được overloading như bên dưới. Thật là “chuyên nghiệp”.
Thực Hành Xây Dựng Ứng Dụng Tính Lương Cho Nhân Viên
Yêu Cầu Chương Trình
Ứng dụng của chúng ta phục vụ một công ty nhỏ. Với một số nguyên tắc sau.
– Công ty này có hai loại nhân viên, đó là nhân viên toàn thời gian và nhân viên thời vụ. – Nhân viên toàn thời gian là lính sẽ hưởng lương 10 củ một tháng. Nhân viên toàn thời gian là sếp sẽ hưởng lương 20 củ một tháng. – Nhân viên toàn thời gian nếu làm thêm ngày nào thì sẽ được cộng thêm 800k mỗi ngày, bất kể chức vụ. – Nhân viên thời vụ cứ làm mỗi giờ được 100k, không phân biệt chức vụ gì cả. Làm nhiều thì hưởng nhiều.
Vậy thôi, ứng dụng sẽ cho phép nhập vào từng nhân viên. Mỗi nhân viên có tên nhân viên. Có loại nhân viên toàn thời gian hay bán thời gian. Nhân viên toàn thời gian thì là nhân viên lính hay nhân viên sếp, có làm thêm ngày nào không. Nhân viên thời vụ thì làm được mấy giờ. Cuối cùng dựa vào các thông tin đó, sẽ xuất ra màn hình lương tương ứng.
Sơ Đồ Lớp
Do yêu cầu chương trình có phần phức tạp, nên chỉ có thể giải thích rõ ràng nhất thông qua sơ đồ lớp mà thôi.
Bạn có thể thấy rằng, sơ đồ này có thêm nhiều thông tin hơn so với những ngày đầu bạn mới làm quen. Để mình giải thích một số thông tin bổ sung này.
– Thông tin package được thể hiện ở dưới tên lớp, với font chữ nhỏ hơn. Như vậy nhìn sơ đồ chúng ta thấy các lớp NhanVien, NhanVienFullTime và NhanVienPartTime nằm trong cùng package model. Lớp Configs nằm trong package util. – Khả năng truy cập của các thuộc tính và phương thức nay rõ ràng hơn. Khi đó dấu (-) là private, dấu (+) là public, và dấu (#) là protected. – Hằng số là các giá trị được viết in hoa. – Còn giá trị static sẽ được gạch chân, như các thuộc tính trong lớp Configs.
Như vậy sơ đồ của chúng ta ngày càng rõ ràng hơn rồi đó.
Xây Dựng Các Lớp
Đến đây bạn tự code được rồi đó.
Đầu tiên là lớp Configs để lưu các giá trị tĩnh, như mức lương tháng, lương ngày, lương giờ,…
package util; public class Configs { public static final int NHAN_VIEN_SEP = 1; public static final int NHAN_VIEN_LINH = 2; public static final long LUONG_NHAN_VIEN_FULL_TIME_SEP = 20000000; public static final long LUONG_NHAN_VIEN_FULL_TIME_LINH = 10000000; public static final long LUONG_LAM_THEM_MOI_NGAY = 800000; public static final long LUONG_NHAN_VIEN_PART_TIME_MOI_GIO = 100000; }Kế đến là lớp cha NhanVien.
package model; public class NhanVien { protected String ten; protected long luong; public NhanVien() { } public NhanVien(String ten) { chúng tôi = ten; } protected String loaiNhanVien() { return ""; } public void xuatThongTin() { System.out.println("===== Nhân viên: " + ten + " ====="); System.out.println("- Loại nhân viên: " + loaiNhanVien()); System.out.println("- Lương: " + luong + " VND"); } }Rồi đến hai lớp con NhanVienFullTime và NhanVienPartTime.
package model; import util.Configs; /** * NhanVienFullTime chính là nhân viên toàn thời gian */ public class NhanVienFullTime extends NhanVien { private int ngayLamThem; private int loaiChucVu; public NhanVienFullTime(String ten) { super(ten); this.loaiChucVu = Configs.NHAN_VIEN_LINH; } public NhanVienFullTime(String ten, int ngayLamThem) { super(ten); this.ngayLamThem = ngayLamThem; this.loaiChucVu = Configs.NHAN_VIEN_LINH; } public void setLoaiChucVu(int loaiChucVu) { this.loaiChucVu = loaiChucVu; } @Override public String loaiNhanVien() { if (loaiChucVu == Configs.NHAN_VIEN_LINH) { } else { } } public void tinhLuong() { if (loaiChucVu == Configs.NHAN_VIEN_LINH) { luong = Configs.LUONG_NHAN_VIEN_FULL_TIME_LINH + ngayLamThem * Configs.LUONG_LAM_THEM_MOI_NGAY; } else if (loaiChucVu == Configs.NHAN_VIEN_SEP) { luong = Configs.LUONG_NHAN_VIEN_FULL_TIME_SEP + ngayLamThem * Configs.LUONG_LAM_THEM_MOI_NGAY; } } } package model; import util.Configs; /** * NhanVienPartTime chính là nhân viên thời vụ */ public class NhanVienPartTime extends NhanVien { private int gioLamViec; public NhanVienPartTime(String ten, int gioLamViec) { chúng tôi = ten; this.gioLamViec = gioLamViec; } @Override public String loaiNhanVien() { return "Nhân viên thời vụ"; } public void tinhLuong() { luong = Configs.LUONG_NHAN_VIEN_PART_TIME_MOI_GIO * gioLamViec; } }Và đây là lời gọi đến từ phương thức main().
package main; import model.NhanVienFullTime; import model.NhanVienPartTime; import util.Configs; public class MainClass { public static void main(String[] args) { NhanVienFullTime sep = new NhanVienFullTime("Trần Văn Sếp"); sep.setLoaiChucVu(Configs.NHAN_VIEN_SEP); NhanVienFullTime linh1 = new NhanVienFullTime("Nguyễn Văn Lính"); NhanVienFullTime linh2 = new NhanVienFullTime("Lê Thị Lính", 3); NhanVienPartTime thoiVu = new NhanVienPartTime("Phan Thị Thời Vụ", 240); sep.tinhLuong(); linh1.tinhLuong(); linh2.tinhLuong(); thoiVu.tinhLuong(); sep.xuatThongTin(); linh1.xuatThongTin(); linh2.xuatThongTin(); thoiVu.xuatThongTin(); } }Đây là kết quả khi bạn thực thi chương trình lên.
Chúng ta vừa trải qua một kiến thức thú vị nữa của Java, kiến thức về nạp chồng phương thức, hay còn gọi overloading. Qua bài học thì bạn cũng đã nắm rõ và phân biệt tốt thế nào là overriding và thế nào là overloading rồi đúng không nào.
Bài Kế Tiếp
Chúng ta cùng làm quen với một trong những đặc tính nổi trội khác trong OOP nữa, đó là tính đa hình, hay còn được gọi với một cái tên xa lạ, khó nhớ, và cũng chẳng thân thương gì ráo: Polymorphism.
Sự Khác Nhau Giữa Overloading Và Overriding Trong Java Là Gì?
Overloading trong Java: hay nói chính xác hơn là Method Overloading (có thể hiểu là nạp chồng phương thức) là một tính năng giúp một lớp trong Java có thể có nhiều phương thức cùng tên nhưng khác các giá trị tham số đầu vào.
Ví dụ lớp MayTinh có phương thức PhepCong như sau:
PhepCong(int soA, int soB); PhepCong(int soC, int soD, int soE);Hai phương thức trên được gọi là Overloading bởi vì chúng có cùng tên là PhepCong và phương thức thứ nhất chỉ có 2 tham số đầu vào là soA và soB, trong khi phương thức thứ hai có 3 tham số đầu vào là soC, soD và soE.
Ví dụ đoạn chương trình Java về Overloading:
class MayTinh { public int PhepCong(int soA, int soB) { return soA + soB; } public int PhepCong(int soA, int soB, int soC){ return soA + soB + soC; } } public class JavaDemo { public static void main(String[] args) { MayTinh A = new MayTinh(); int cong2So = A.PhepCong(2, 3); int cong3So = A.PhepCong(4, 5, 6); System.out.println(cong2So);Overriding trong Java: được sử dụng trong trường hợp kế thừa lớp, khi bạn muốn định nghĩa lại một phương thức nào đó ở lớp con mà bản thân phương thức đó đã có mặt ở lớp cha thì phương thức bạn định nghĩa lại ở lớp con gọi là Method Overriding (có thể hiểu là ghi đè phương thức).
Mục đích của Overriding là gì? Một lớp cha thông thường sẽ được nhiều lớp con kế thừa, do đó phương thức trong lớp cha có thể phù hợp với lớp con này mà không phù hợp với lớp con kia.
Ví dụ lớp cha là lớp ConNguoi thì lớp con sẽ có nhiều lớp là NguoiA, NguoiB, NguoiC, … cho nên phương thức DiChuyen ở lớp cha chẳng hạn, không thể dùng chung cho tất cả các lớp con được, mà ở mỗi lớp con, bạn sẽ phải định nghĩa một phương thức riêng như người A đi bộ, người B chạy, …
Ví dụ đoạn chương trình Java về Overriding:
Phương Thức Nạp Và Rút Tiền Từ Sàn Giao Dịch Hotforex
Sàn HotForex là gì ? Một vài nét khái quát cơ bản
Điều này khiến Hotforex không thể xuất hiện các xung đột từ khách hàng. Tính đến thời điểm hiện tại, hotforex đang là một nhà môi giới cung cấp các dịch vụ cho hơn 350.000 tài khoản. Mỗi tháng lượt truy cập của forex lên đến 2 triệu lượt.
Đây cũng là 1 trong những sàn forex bonus có nhiều chương trình ưu đãi nhất năm dành cho các trader.
Cách nạp tiền sàn HotForex
HotForex có những cách nạp tiền rất phổ biến như Visa, Skrill, nạp trực tiếp bằng tiền điện tử Bitcoin, Ethereum,… Với trường hợp nạp tiền qua thẻ tín dụng, số tiền bạn rút ra không được phép vượt quá số tiền đã nạp. Tính đến thời điểm bây giờ, sàn HotForex đã cho phép nạp tiền trực tiếp qua ngân hàng địa phương. Hình thức nạp này vô cùng thuận tiện và rất tiết kiệm chi phí. Và đặc biệt tất cả các hình thức nạp tiền của sàn HotForex đều được miễn phí. Tiền nạp tối thiểu sàn HotForex sẽ tùy thuộc vào cách thức nạp của bạn.
Chọn nạp tiền – Deposit.
Bạn cần chọn những hình thức nạp, gồm 3 cách nạp sau
Cách 1 : Nạp tiền bằng cách chuyển khoản qua ngân hàng Internet Banking. Bạn chỉ cần có tài khoản Internet Banking với một trong các ngân hàng sau ACB, BIDV, Đông Á, Eximbank, Sacombank, TechcomBank, Vietcombank, VietinBank.
Cách 2 : Chọn nạp tiền qua ví điện tử hay còn gọi là Crypto Payments. Sau đó nhập số tiền bạn muốn nạp và tiền điện tử tương ứng.
Cách 3 : Chọn nạp tiền qua Visa. Chỉ với vài bước đơn giản đó là chọn số tiền bạn muốn nạp và điền tất cả các thông tin về Visa.
Như vậy là bạn đã hoàn thành các bước nạp tiền.
Cách rút tiền sàn Giao Dịch HotForex đối với Internet Banking
Số tiền rút tối thiểu là 15$.
Lệnh rút tiền phải được thực hiện trước 14h chiều theo giờ Việt Nam sẽ được xử lý trong ngày.
Lệnh rút tiền được thực hiện sau 14h giờ sẽ được xử lý vào ngày tiếp theo.
Bước 2 : Nhập các thông tin rút tiền theo yêu cầu là bạn có thể hoàn thành bước rút tiền của mình.
Overload Và Override Là Gì, So Sánh Overload Và Override
Overload là gì ?
Overload – Nạp chồng phương thức đơn giản là có vài phương thức trùng tên nhưng khác nhau về đối số. Cài chồng phương thức cho phép ta tạo nhiều phiên bản của một phương thức, mỗi phiên bản chấp nhận một danh sách đối số khác nhau, nhằm tạo thuận lợi cho việc gọi phương thức. Nạp chồng phương thức Overload được sử dụng để thu được tinh đa hình tại 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); } }Các cách nạp chồng overload
Thay đổ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); } }Thay đổi 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); } }Tự động ép kiểu trong nạp chồng
Theo hình trên thì kiểu byte có thể ép sang các kiểu lớn hơn nó như short, int, float, long, double nhưng nó sẽ ưu tiên kiểu short. Hoặc kiểu int có thể ép sang kiểu float, long, double nhưng nó sẽ ưu tiên ép sang kiểu long vì long gần nó hơn so với 2 kiểu 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 quả in ra sẽ là “Second method will be call” tức là hàm sum thứ 2 sẽ được gọi vì tham số truyền vào là kiểu int, nó sẽ ưu tiên ép sang kiểu lớn hơn nó và có giá trị gần nhất nó, ở đây là kiểu long.
Từ đó ta có ta có thể suy ra là kiểu double không thể tự động ép kiểu.
Nạp chồng phương thức khởi tạo
public class Student { int id; String name; Student() { System.out.println("gọi Constructor mặc định"); } Student(int id, String name) { this();Các quy tắc nạp chồng
Các phương thức overloaded phải cùng tên nhưng khác nhau ở các tham số.
Chúng có thể được định nghĩa cùng hoặc khác kiểu dữ liệu trả về.
Chúng có thể được định nghĩa cùng hoặc khác access modifier.
Các phương thức không được gọi là overloaded nếu chúng chỉ khác nhau ở kiểu dữ liệu trả về hoặc access modifier.
Override LÀ GÌ ?
Overriding là một tính năng cho phép một lớp con hoặc lớp con cung cấp một triển khai cụ thể của một phương thức đã được cung cấp bởi một trong các lớp siêu hoặc các lớp cha của nó. Nói cách khác, nếu lớp con cung cấp trình triển khai cụ thể của phương thức mà đã được cung cấp bởi một trong các lớp cha của nó, thì đó là ghi đè phương thức.
Override được sử dụng để thu được tính đa hình tại runtime.
Gọi phiên bản phương thức của lớp cha
Có nhiều trường hợp khi cài đè 1 hành vi của lớp cha, nhưng ta lại không muốn thay thế hoàn toàn mà chỉ muốn bổ sung một số chi 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ó cung cấp phương thức withdraw(double) với chức năng rút tiền, phương thức này thực hiện quy trình rút tiền cơ bản: trừ số tiền rút khỏi số dư tài khoản (balance). FeeBasedAccount là loại tài khoản ngân hàng thu phí đối 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 làm thêm một việc là trừ phí rút tiền khỏi số dư tài khoản. Như vậy, FeeBasedAccount có cần đến nội dung của bản withdraw() được Account cung cấp sẵn, nhưng vẫn phải cài đè vì nội dung đó không đủ dùng. Ta cũng không muốn chép nội dung bản withdraw() của Account vào bản của FeeBasedAccount. Thay vào đó, ta muốn có cách gọi phương thức withdraw() của Account từ trong phiên bản cài đè tại FeeBasedAccount.
Cách giải quyết: từ trong phiên bản cài đè tại lớp con, ta muốn gọi đến chính phương thức đó của lớp cha, từ khóa super cho phép gọi đến cách 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 Account { private double fee = 10; public void withdraw(double money) { super.wirhDraw(money); balance -= fee; } } }Các quy tắc cho việc cài đè
Danh sách tham số phải trùng nhau, kiểu giá trị 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 bản của lớp cha.
Nói cách khác, quyền truy nhập mà phiên bản của lớp con cho phép phải bằng hoặc rộng hơn phiên bản của lớp cha. Ta không thể cài đè một phương thức public bằng một phiên bản private. Nếu không, tình huống xảy ra là một lời gọi phương thức đã được trình biên dịch chấp nhận vì tưởng là phương thức public nhưng đến khi nó chạy lại bị máy ảo từ chối vì phiên bản được gọi lại là private.
Phải là quan hệ IS-A (kế thừa).
Các phương thức final, static, private không thể cài đè.
Sự khác nhau giữa overload và override
Cập nhật thông tin chi tiết về Java Bài 29: Nạp Chồng Phương Thức (Overloading) trên website Channuoithuy.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!