Cập nhật nội dung chi tiết về Java Bài 29: Nạp Chồng Phương Thức (Overloading) mới nhất trên website Cuocthitainang2010.com. Hy vọng thông tin trong bài viết sẽ đáp ứng được nhu cầu ngoài mong đợi của bạn, chúng tôi sẽ làm việc thường xuyên để cập nhật nội dung mới nhằm giúp bạn nhận được thông tin nhanh chóng và chính xác 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.
Bài 29: Soạn Bài Mùa Xuân Nho Nhỏ
SOẠN BÀI: MÙA XUÂN NHO NHỎ
I. Đọc, tìm hiểu chung về văn bản 1. Tác giả, tác phẩm
Thanh Hải (1930-1980).
Quê : Phong Điền – Thừa Thiên Huế.
– Tham gia hoạt động văn nghệ từ cuối năm kháng chiến chống Pháp đến kháng chiến chống Mĩ.
– Là một trong những cây bút có công xây dựng nền văn học cách mạng ở miền Nam từ những ngày đầu tiên.
– 1965, được tặng giải thưởng văn học Nguyễn Đình Chiểu.
– Giọng thơ Thanh Hải là tiếng thét căm thù tội ác quân xâm lược, là khúc tâm tình tha thiết của đồng bào chiến sĩ miền Nam gửi ra miền Bắc.
Bài thơ được sáng tác tháng 11-1980 khi ông nằm trên giường bệnh. Đây là sáng tác cuối cùng của nhà thơ Thanh Hải.
2. Bố cục.
Bài thơ có thể chia làm 4 phần:
– Khổ đầu (6 dòng): Cảm xúc trước mùa xuân của trời đất.
– 2 khổ 2,3: Hình ảnh mùa xuân đất nước.
– 2 khổ 4,5: Suynghĩ và ước nguyện của nhà thơ.
– Khổ cuối là lời ca ngợi quê hương, đất nước và giai điệu dân ca xứ Huế.
II. Đọc, tìm hiểu văn bản 1. Mùa xuân của thiên nhiên đất trời Mọc giữa dòng sông xanh Một bông hoa tím biếc Ơi con chim chiền chiện Hót chi mà vang trời.
Hình ảnh chọn lọc tiêu biểu điển hình của mùa xuân.
– Từ “mọc” được đặt ở đầu câu: nghệ thuật đảo ngữ nhằm : nhấn mạnh, khắc hoạ sự khoẻ khoắn. “Mọc” tiềm ẩn một sức sống, sự vươn lên, trỗi dậy. Giữa dòng sông rộng lớn, không gian mênh mông chỉ một bông hoa thôi mà không hề gợi lên sự lẻ loi đơn chiếc. Trái lại, bông hoa ấy hiện lên lung linh, sống động, tràn đầy sức (sống) xuân.
– Màu sắc: gam màu hài hoà dịu nhẹ tươi tắn. Màu xanh lam của nước sông (dòng sông Hương) hào cùng màu tím biếc của hao, một màu tím giản dị, thuỷ chung, mộng mơ và quyến rũ. Đó là màu sắc đặc trưng của xứ Huế.
– Âm thanh: Tiếng chim chiền chiện, loài chim của mùa xuân.
Cách dùng các từ than gọi “ơi”, “chi”: mang chất giọng ngọt ngào đáng yêu của người xứ Huế (thân thương, gần gũi), mang nhiều sắc thái cảm xúc như một lời trách yêu.
– Chỉ có một bông hoa tím biếc
– Chỉ có một dòng sông xanh.
– Một tiếng chim chiền chiện hoà vang trời.
Mùa xuân trong thơ Thanh Hải chẳng có mai vàng, đào thắm cũng chẳng có muôn hoa khoe sắc màu rực rỡ. Mùa xuân trong thơ Thanh Hải thật giản dị, đằm thắm.
– Cảm xúc say sưa ngây ngất xốn xang rạo rực trước cảnh đất trời vào xuân.
Giọt long lanh rơi:
– Giọt sương
– Giọt nắng
– Giọt mùa xuân
– Giọt hạnh phúc
– Giọt âm thanh
Tiếng chim chiền chiện hót vang trời nhưng không tan biến vào không trung. Nó như ngưng đọng lại thành từng giọt âm thanh, như những hạt lưu li trong vắt long lanh chói ngời. Ở đây có sự chuyển đổi cảm giác: từ thính giác đến thị giác, xúc giác. Những yếu tố huyền ảo trong bài thơ được thể hiện một cách sáng tạo, gợi cảm và tài tình.
– “tôi đưa tay tôi hứng”: Sự trân trọng vẻ đẹp của thi nhân đối với vẻ đẹp chất nhạc của trời với sông của chim với hoa thể hiện sự đồng cảm của thi nhân trước thiên nhiên và cuộc đời.
2. Hình ảnh mùa xuân đất nước Mùa xuân người cầm súng Lộc giắt đầy quanhlưng Mùa xuân người ra đồng Lộc trải dài nương mạ.
Lộc non chồi biếc: Sức sống của con người. Đây là những hình ảnh tượng trưng, kết cấu đối xứng.
Tả thực: Mùa xuân là mùa ra quân, mùa chiến thắng, mùa xuân cũng là mùa người nông dân ra đồng gieo trồng lúa xuân.
Ý nghĩa tượng trưng: 2 nhiệm vụ bảo vệ tổ quốc, xây dựng đất nước.
Đất nước như vì sao Cứ đi lên phía trước.
Một đất nước với 4000 năm dựng nước và giữ nước đã trải qua muôn vàn khó khăn thử thách, gian khổ ác liệt, tưởng chừng như không thể vượt qua, thế mà vẫn kiên cường, hiên ngang, dũng cảm như chính quê hương của tác giả – một mảnh đất kiên trung, ngoan cường, bất khuất.
Nghệ thuật so sánh: “Đất nước như vì sao”.
Sự trường tồn vĩnh cửu của thiên nhiên được so sánh với tầm vóc củadân tộc Việt Nam:
“Sống vững chãi 4 ngàn năm sừng sững… nhân ái chan hoà”
3. Ước nguyện của tác giả
Qua đó, tác giả thể hiện niềm tin vào cách mạng, vào tương lai của đất nước, định hướng, mục đích sống của mỗi con người. Đó cũng là sức sống, sức vươn lên không ngừng của đất nước vào xuân.
Ta làm con chim hót Ta làm một nhành hoa Ta nhập vào hoa ca Một nốt trầm xao xuyến.
Tác giả muốn làm:
– Một con chim hót vang trời (mang âm thanh).
– Một nhành hoa (hương thơm ngào ngạt)
– Một nốt trầm (sự vui vẻ, yêu đời).
Nhưng tất cả đều một thôi: một con chim trong muôn ngàn loài chim, một nhành hoa trong biết bao loài hoa, một nốt trầm trong bè trầm bao la của thế giới âm nhạc.
– Trong cái không khí réo rắt đầy đủ các cung bậc âm thanh, nhà thơ thiết tha hiến dâng, hoà nhập vào cuộc sống vui tươi sôi nổi ấy. Thật đáng trân trọng biết nhường nào khi ta biết rằng, suốt một đời người – một đời thơ, Thanh Hải đã cống hiến nhiều tâm huyết cho sự nghiệp chung của dân tộc mà ông chỉ khiêm tốn xin làm một nốt trầm xao xuyến nhậpvào bản hoà ca chung. Lời ước nguyện chân thành tha thiết: Làm một mùa xuân nho nhỏ, cống hiến phần tốt đẹp, dù nhỏ bé của mình cho mùa xuân lớn của đất nước, của cuộc đời chung. Sự chuyển đổi cách xưng hô từ tôi (riêng) sang ta (chung) chính là sự thể hiện của khát vọng hoà nhập ấy.
Một mùa xuân nho nhỏ Lặng lẽ dâng cho đời Dù là tuổi hai mươi Dù là khi tóc bạc
– Hình ảnh có tính chất biểu tượng: “mùa xuân – tuổi hai mươi”: trẻ trung sung sức; “Tóc bạc”: trở về già.
Mạch cảm xúc chuyển từ sôi nổi sang trầm lắng.
Tình cảm trào dâng, suy tư được thể hiện nội dung chính con người luôn gắn bó, hoà nhập với thiên nhiên, đất nước, bất chấp không gian, thời gian nghịch cảnh. Đó là sự dâng hiến thầm lặng.
– Khổ thơ đầu được mở đầu bằng một phong cảnh Huế: hoa nở, chim hót, dòng sông êm đềm.
Kết thúc Một điệu dân ca xứ Huế quen thuộc, ngọt ngào, êm dịu, sử dụng ngôn ngữ giàu nhịp điệu, các vần bằng tha thiết, êm ái. Kết cấu đầu cuối tương ứng tạo sự hài hoà, cân đối cho bài thơ, đồng thời thể hiện rõ hơn khát vọng hoà nhập với cuộc đời của tác giả.
III. Luyện tập:
Phương Thức Equals() Và Hashcode() Trong Java 2022
Bài viết này giúp bạn hiểu khái niệm 2 phương thức quan trọng: Phương thức equals() và hashCode() trong Java.
Khi sử dụng các collection, Để nhận được các hành vi mong muốn, chúng ta nên ghi đè các phương thức equals() và hashCode() trong các lớp của các phần tử được thêm vào collection.
Lớp Object (lớp cha của tất cả các lớp trong Java) định nghĩa hai phương thức equal() và hashCode(). Điều đó có nghĩa là tất cả các lớp trong Java (bao gồm cả các lớp bạn đã tạo) thừa kế các phương thức này. Về cơ bản, lớp Object thực hiện các phương thức này cho mục đích chung.
Tuy nhiên, bạn sẽ phải ghi đè chúng một cách cụ thể cho các lớp có đối tượng được thêm vào các collection, đặc biệt là các collection dựa trên bảng băm như HashSet và HashMap.
Phương thức equals() trong Java
Ví dụ phương thức equals() của đối tượng String
Ví dụ ghi đè phương thức equals()
Ví dụ ghi đè phương thức equals() của phần tử của collection
Phương thức hashCode() trong Java
Các quy tắc cho phương thức equals() và hashCode() trong Java
Ví dụ ghi đề phương thức equals(), không ghi đè hashCode()
Tham khảo
Phương thức equals() trong Java
Khi so sánh hai đối tượng với nhau, Java gọi phương thức equals() của chúng trả về true nếu hai đối tượng bằng nhau hoặc false nếu hai đối tượng là khác nhau. Lưu ý rằng phép so sánh sử dụng phương thức equals() so với sử dụng toán tử == là khác nhau.
Đây là sự khác biệt:
Phương thức equals() được thiết kế để so sánh hai đối tượng về mặt ngữ nghĩa (bằng cách so sánh các thành viên dữ liệu của lớp), trong khi toán tử == so sánh hai đối tượng về mặt kỹ thuật (bằng cách so sánh các tham chiếu của chúng, nghĩa là địa chỉ bộ nhớ).
LƯU Ý: Việc cài đặt phương thức equals() trong lớp Object so sánh các tham chiếu của hai đối tượng. Điều đó có nghĩa là bạn nên ghi đè nó trong các lớp của bạn để so sánh ngữ nghĩa. Hầu hết các lớp trong JDK ghi đè phương thức equals() của riêng chúng, chẳng hạn như String, Date, Integer, Double, v.v.
Ví dụ phương thức equals() của đối tượng String
Ví dụ điển hình so sánh chuỗi trong Java, để thấy sự khác nhau giữa phương thức equal() và toán tử ==.
Kết quả:
s1 == s2: false s1.equals(s2): trueSo sánh tham chiếu (toán tử ==) trả về false vì s1 và s2 là hai đối tượng khác nhau được lưu trữ ở các vị trí khác nhau trong bộ nhớ. Trong khi so sánh ngữ nghĩa trả về true bởi vì s1 và s2 có cùng giá trị (“THis is a string”) có thể được coi là bằng nhau về mặt ngữ nghĩa.
Ví dụ ghi đè phương thức equals()
Tương tự như vậy, giả sử chúng ta có lớp Student và cài đặt phương thức equal() như sau:
Trong thực tế, chúng ta có thể xem xét hai đối tượng Student có ngữ nghĩa tương đương nhau nếu chúng có cùng thuộc tính (id, name, email và age). Bây giờ, hãy xem cách ghi đè phương thức equals() trong lớp này để xác nhận rằng hai đối tượng Student có các thuộc tính giống nhau được coi là bằng nhau:
Tạo ra lớp chúng tôi để kiểm tran phương thức equal() trong lớp Student.
Kết quả:
student1 == student2: false student1.equals(student2): true student2.equals(student3): falseVí dụ ghi đè phương thức equals() của phần tử của collection
Ta có lớp chúng tôi có nội dung như sau:
Ở đây, phương thức equals() này chỉ so sánh thuộc tính ID của hai đối tượng Student.
Chúng ta sẽ coi mỗi đối tượng Student có một ID duy nhất, và xem hai đối tượng sinh viên là bằng nhau nếu chúng có ID giống nhau.
Phương thức contains(Object) của interface List trong java có thể được sử dụng để kiểm tra nếu đối tượng được chỉ định tồn tại trong danh sách. Về bản chất, phương thức equal() được gọi bên trong phương thức contains(Object).
Kết quả:
Search student1: true Search student4: falsePhương thức hashCode() trong Java
Định nghĩa phương thức hashCode() trong lớp Object:
Bạn có thể thấy phương thức này trả về một số nguyên. Vậy nó được sử dụng ở đâu?
Đây là bí mật:
Số băm này được sử dụng bởi các collection dựa trên bảng băm như Hashtable , HashSet và HashMap để lưu trữ các đối tượng trong các container nhỏ được gọi là “nhóm”. Mỗi nhóm được liên kết với mã băm và mỗi nhóm chỉ chứa các đối tượng có mã băm giống hệt nhau.
Nói cách khác, một bảng băm nhóm các phần tử của nó bằng các giá trị mã băm của chúng. Sự sắp xếp này giúp cho bảng băm định vị một phần tử một cách nhanh chóng và hiệu quả bằng cách tìm kiếm trên các phần nhỏ của collection thay vì toàn bộ collection.
Nhận giá trị mã băm của phần tử được chỉ định bằng cách gọi phương thức hashCode().
Tìm nhóm thích hợp được liên kết với mã băm đó.
Bên trong nhóm, tìm phần tử chính xác bằng cách so sánh phần tử được chỉ định với tất cả các phần tử trong nhóm. Bằng phương thức equals() của phần tử đã chỉ định được gọi.
Có nói rằng, khi chúng ta thêm các đối tượng của một lớp vào một collection dựa trên bảng băm (HashSet, HashMap ), phương thức hashCode() của lớp được gọi để tạo ra một số nguyên (có thể là một giá trị tùy ý). Con số này được sử dụng bởi bộ sưu tập để lưu trữ và định vị các đối tượng một cách nhanh chóng và hiệu quả, vì collection dựa trên bảng băm không duy trì thứ tự các phần tử của nó.
LƯU Ý: Việc thực thi phương thức mặc định hashCode() trong lớp Object trả về một số nguyên là địa chỉ bộ nhớ của đối tượng. Bạn nên ghi đè phương thức trong các lớp của bạn. Hầu hết các lớp trong JDK ghi đè phương thức hashCode() của riêng chúng, chẳng hạn như String , Date , Integer , Double , v.v.
Các quy tắc cho phương thức equals() và hashCode() trong Java
Như đã giải thích ở trên, collection dựa trên bảng băm xác định một phần tử bằng cách gọi phương thức hashCode() và equals() của nó, vì vậy khi ghi đè các phương thức này chúng ta phải tuân theo các quy tắc sau:
Khi phương thức equals() được ghi đè, phương thức hashCode() cũng phải được ghi đè.
Nếu hai đối tượng bằng nhau, mã băm của chúng phải bằng nhau.
Nếu hai đối tượng không bằng nhau, không có ràng buộc về mã băm của chúng (mã băm của chúng có thể bằng nhau hay không).
Nếu hai đối tượng có mã băm giống nhau, thì không có ràng buộc nào về sự bình nhau của chúng (chúng có thể bằng nhau hay không).
Nếu hai đối tượng có mã băm khác nhau, chúng không được bằng nhau.
Nếu chúng ta vi phạm các quy tắc này, các collection sẽ hoạt động có thể không đúng như các đối tượng không thể tìm thấy, hoặc các đối tượng sai được trả về thay vì các đối tượng chính xác.
Ví dụ ghi đề phương thức equals(), không ghi đè hashCode()
Hãy xem phương thức hashCode() và equals() ảnh hưởng như thế nào đến hành vi của một đối tượng Set.
Lớp Student.java
Lớp EqualStudent3 .java
Kết quả:
Student 456: Dung - dung@gmail.com - 18 Student 123: Cong - cong@gmail.com - 22 Student 123: Cong - cong@gmail.com - 22Hãy nhìn xem, bạn có nhận thấy rằng có 2 sinh viên trùng lặp (ID: 123), phải không?
Đây là lý do:
Tập Set gọi các phương thức equals() và hashCode() trên mỗi đối tượng được thêm vào để đảm bảo không có sự trùng lặp. Trong trường hợp của chúng ta, lớp Student chỉ ghi đè phương thức equals(). Và phương thức hashCode() thừa kế từ lớp Object trả về các địa chỉ bộ nhớ của mỗi đối tượng không nhất quán với phương thức equals(). Do đó, đối tượng Set xử lý đối tượng student1 và student2 thành hai phần tử khác nhau.
Bây giờ, chúng ta hãy ghi đè phương thức hashCode() trong lớp Student như sau:
Kết quả:
Student 123: Cong - cong@gmail.com - 22 Student 456: Dung - dung@gmail.com - 18Good! Phần tử trùng lặp hiện đã bị xóa. Đó chính là điều chúng tôi muốn.
Với các phương thức equals() và hashCode() được ghi đè đúng cách, chúng ta cũng có thể thực hiện tìm kiếm trên tập hợp như sau:
Kết quả:
Để tự mình thử nghiệm nhiều hơn, hãy thử loại bỏ phương thức equals() hoặc hashCode() và quan sát kết quả.
Bài 3: Suy Luận Quy Nạp
Tóm tắt lý thuyết
1. Quy nạp là gì?
Quy nạp là loại suy luận có hai thuộc tính cơ bản sau:
(1) Xuất phát từ những tiền đề là những phán đoán cụ thể.
(2) Kết luận rút ra là phán đoán khái quát hóa nói chung không mang tính tất suy lôgic.
Thí dụ:
Đồng dẫn điện.
Sắt dẫn điện.
Nhôm dẫn điện.
Đồng, sắt, nhôm đều là kim loại.
⇒ Vậy, mọi kim loại đều dẫn điện.
Hình thức lôgic có dạng sau đây:
⇒ Vậy, mọi S đều là P.
Như vậy, quy nạp và suy diễn về căn bản là hai quá trình ngược nhau: nếu suy diễn nói chung là quá trình đi từ nhũng tiền đề khái quát đến kết luận cụ thể thì quy nạp chỉ là quá trình đi từ nhũng tiền đề cụ thể đến kết luận khái quát. Ngoài ra, nếu suy diễn là quá trình tất suy lôgic, cho kết luận chắc chắn chân thực khi bảo đảm đầy đủ các điều kiện của suy luận đứng đắn thì quy nạp là quá trình không tất suy lôgic, kết luận chỉ gần chân thực, mức độ chân thực của kết luận quy nạp phụ thuộc vào số lượng và độ chân thực của các phán đoán tiền đề.
Lược đồ lôgic chung của quy nạp có dạng: (sumlimits_{i – 1}^n T )Đ i
Với ký hiệu có nghĩa là có thể rút ra kết luận.
Quy nạp có nhiều loại khác nhau, nếu tổng kết được tất cả các trường hợp thì ta gọi là quy nạp hoàn toàn, trái lại thì gợi là quy nạp không hoàn toàn. Quy nạp thông thường hàng ngày ta gọi là quy nạp phổ thống. Nó khác vối quy nạp khoa học. Quy nạp phổ thống dựa trên khái quát hóa kinh nghiệm thông thường. Trái lại, quy nạp khoa học dựa trên khái quát hóa các sự kiện thực nghiệm khoa học, chính xác, chặt chẽ hơn nhiều so với kinh nghiệm thông thường hàng ngày.
2. Quy nạp hoàn toàn
Thí dụ:
Thủy tinh xoay quanh mặt trời theo quỹ đạo elíp.
Kim tinh xoay quanh mặt tròi theo quỹ đạo elíp.
Quả đất xoay quanh mặt trời theo quỹ đạo elíp.
Hóa Linh xoay quanh mật trời theo quỹ đạo elíp.
Mộc tinh xoay quanh mặt trời theo quỹ đạo elíp.
Thô tinh xoay quanh mặt trời theo quỹ đạo elíp.
Thiên vương tinh xoay quanh mặt tròi theo quỹ dạo elíp. Hải vương tinh xoay quanh mặt trời theo quỷ đạo elíp. Diêm vương tinh xoay quanh mặt trời theo quỹ dạo elíp. Tất cả các vật thể này đều là hành tinh của Thái dương hệ.
⇒ Vậy tất cả các hành tinh của Thái dương hệ đều quay xung quanh mặt trời theo quỹ đạo hình elíp.
Hình thức lôgic có dạng:
⇒ Vậy S-P Quy nạp hoàn toàn cần tuân theo một số yêu cầu lôgic sau đây:
Phải biết chính xác số đối tượng và từng đối tượng của lớp cần khái quát, không được bỏ sót hoặc trùng lặp.
Số đối tượng không lớn.
Dấu hiệu khái quát hóa phải có trong mỗi đối tượng của lớp cần khái quát.
Vì những yêu cầu chặt chẽ như vậy, cho nên quy nạp hoàn toàn chỉ thực hiện được trong những trường hợp giản đơn khi người ta có điều kiện liệt kê đầy đủ tiền đề quy nap.
Trong toán học nói chung, số học nói riêng, người ta có thể sử dụng quy nạp hoàn toàn để chứng minh các định lý toán học. Quy nạp toán học có thể xuất phát từ vô số đối tượng để khái quát hóa một dặc tính nào đó của tập hợp vô hạn cần khái quát. Lược đồ logic chứng minh bằng quy nạp toán học có dạng như sau:
Kết luận đúng với một hoặc một vài phần tử đầu tiên.
Nếu kết để đúng với một phần tử bất kỳ thì nó cùng đúng với phần tử kế tiếp nó.
Thí dụ: chứng minh định lý số học sau đây:
Với mọi số le (2n-1) thì tổng n số lẻ liên tiếp đầu tiên:
Cách chứng minh định lý này theo 3 bước như sau:
Bước thứ nhất, ta phải chứng minh định lý trên đúng cho trường hợp n = 1. Điều này được thực hiện bằng cách thử n = 1 vào công thức ta thấy công thức đúng, vì đương nhiên 1 =1 2
Bước thứ hai, ta giả định công thức trên đúng cho trường hợp n = k bất kỳ. Nghĩa là ta có công thức
Bước thứ ba, ta phải chứng minh nếu n – k là dúng (theo giả định) thì công thức trên cũng đúng cho trường hợp n = k+1, nghĩa là phải chứng mmh:
1 + 3 +….. + (2k-l) + [2(k+1) – 1] = (k+1) 2 (2)
Sử dụng (1) thay vào (2), ta sẽ có: k2 + 2(k+1)-l = k2 + 2k +1 = (k+l)2. Đây là điều đã chứng minh.
3. Quy nạp không hoàn toàn
Quy nạp không hoàn toàn có hai loại chính: (1) Quy nạp pho thống và (2) Quy nạp khoa học.
3.1 Quy nạp phổ thông
Thí dụ:
Thiên nga ở châu Âu có lông trắng.
Thiên nga ở châu Mỹ có lông trắng.
Thiên nga ở châu Á có lông trắng.
⇒ Vậy mọi thiên nga đều có lông trắng.
Kết luận khái quát hóa quy nạp là chân thực cho đến khi người ta phát hiện ở Ôxtrâylia có thiên nga đen.
Quy nạp phổ thống thực chất là dựa trên sự liệt kê giản đơn các sự kiện kinh nghiệm, nhưng có thể kết luận khái quát hóa phóng đại.
Do đó, xác suất giá trị chân lý của kết luận thường là lớn hơn 0 nhưng rất nhỏ hơn 1. Nếu ký hiệu xác suất là p thì ta sẽ có công thức xác suất giá trị chân lý của kết luận quy nạp không hoàn toàn là:
0 < p<< 1
Như đã nói ở trên, kết luận quy nạp hoàn toàn là chân thực, nghĩa là xác suất giá trị chân lý của nó bằng 1; do đó, một cách tổng quát, giá trị chân lý của nó bằng 1. Như vậy, giá trị chân lý của kết luận quy nạp được hiển thị qua công thức sau:
0 < p (le ) 1
3.2 Quy nạp khoa học
Quy nạp khoa học khác căn bản so với quy nạp phổ thông ở chỗ các tiền để là những sự kiện thực nghiệm khoa học chính xác.
Thí dụ:
Bằng quy nạp phổ thông người ta có thể thấy nước giãn nở ở nhiệt độ cao như 200c, 30°c, 40°c… và có thể kêt luận rằng sự Lăng nhiệt độ làm cho nước giãn nở. Nhưng kiểm tra nhiều lần bằng thực nghiệm vật lý thì người ta phát hiện ra rằng đặc biệt trong khoảng nhiệt độ từ 00 đến 4°c nước co lại chứ không giãn nở. Đó mới là quy nạp khoa học.
Ngày xưa thuần túy bằng trực quan thông thường người ta cho rằng quả đất đứng im và mọi vật xoay xung quanh nó. Nhưng đó chỉ là quy nạp phổ thông. Bằng quy nạp vật lý thiên văn, người ta nói quả đất không đứng im tuyệt đối, mà là một trong những hành tinh quay xung quanh mặt trời.
Nhờ quy nạp khoa học mà người ta phát hiện được những sai lầm thường gặp trong quy nạp phổ thông, nghĩa là tránh được những sai lôgic như:
Khái quát hóa phóng đại
Khái quát không có căn cứ đầy đủ
Lẫn lộn giữa cái có điều kiện và cái vô điều kiện
Lẫn lộn quan hệ trước – sau với quan hệ nhân – quả
4. Quy nạp khoa học trong việc xác định mối liên hệ nhân quả của các hiện tượng
Nguyên lý nhân quả là cơ sở lôgic của các phương pháp quy nạp khoa học. Nó thừa nhận rằng mọi sự vật, hiện tượng đều có nguyên nhân xác định và đều gây ra những kết quả nhất định.
Ph.Bêcơn và đặc biệt là chúng tôi trong tác pham “Bàn về lôgic” (viết năm 1843) đã xây dựng hệ thống phương pháp quy nạp khoa học để xác định nguyên nhân, khi đã biết một số hiện tượng coi như là kết quả của nó. Các phương pháp truy tìm nguyên nhân hao gồm:
4.1 Phương pháp phù hợp
Nếu hai hay nhiều trường hợp về hiện tượng được khảo sát, chỉ có một sự kiện chung thì sự kiện mà hết thảy mọi trường hợp về hiện tượng ấy đều phù hợp, phải là nguyên nhân của hiện tượng ấy.
Thí dụ: Thí nghiệm về dao động của con lắc toán học, tức là dao động của chất điểm, các nhà vật lý phát hiện ra rằng chu kỳ dao động (a) của con lắc chỉ giống nhau khi chiều dài (A) của sợi dây treo chất điểm giống nhau, nó không phụ thuộc vào chất liệu (B, D, G) và hình dạng (C, E, H) của con lắc. Từ đó, kết luận quy nạp rằng chính chiều dài (A) của con lắc toán học là nguyên nhân trực tiếp của chu kỳ dao động (a) của nó.
Lược đồ lôgic có dạng:
Phương pháp này còn được gọi là phương pháp giống nhau duy nhất. Xác suất chân lý của kết luận trong trường hợp này nói chung là nhô hơn hoặc bằng 1, vì thực chất nó dựa trên phép kéo theo tình thái:
A → a, a A
Chỉ có cách thay đổi nhiều hoàn cảnh thí nghiệm khác nhau, thì mới có the làm cho xác suất chân lý của kết luận quy nạp gần bằng 1.
4.2 Phương pháp khác nhau duy nhất
Phương pháp khác nhau duy nhất hay còn được gọi là phương pháp bất đồng được phát biểu như sau: một trường hợp có hiện tượng xuất hiện, một trường hợp không có. Nếu hai trường hợp ấy có hết thảy mọi sự kiện chung, duy chỉ trừ một sự kiện, thì sự kiện do đó mà hai trường hợp khác nhau chính là nguyên nhân của hiện tượng.
Thí dụ: Gõ một cái chuông ta nghe kêu (a) khi xung quanh có không khí (A); nó không phụ thuộc vào vật liệu (B) hoặc hình thức (C) chuông. Vậy có thể rút ra kết luận quy nạp rằng, không khí (A) là nguyên nhân của hiện tượng âm thanh lan truyền trong không gian (a).
Lược đồ lôgic có dạng:
Thực chất phương pháp bất đồng cũng dựa trên phép kéo theo tình thái:
A → a, (overline A ) (overline a)
Do đó, xác suất chân lý của kết luận quy nạp nói chung là nhỏ hdn 1, chỉ gần chân thực mà thôi.
4.3 Phương pháp phù hợp và bất đồng
Lược đồ logic có dạng:
Thí dụ: trong sản xuất lương thực, nếu có phân bón (A) thì năng suất nâng cao (a), không có phân bón (A) thì năng suất không cao (ã). Vậy có thể rút ra suy luận quy nạp rằng phân bón là nguyên nhân của năng suất cao.
4.4 Phương pháp cùng biến đổi
Phương pháp cùng biến đổi hay là biến đổi kèm theo có lược đồ lôgic như sau:
Thí dụ: trong cùng điều kiện áp suất không khí (B) cùng nguồn nhiệt (C), người ta thấy cứ tăng nhiệt độ thì vật rắn nở ra. Vậy có thể kết luận quy nạp rằng biến đổi nhiệt độ là nguyên nhân thay đổi thể tích của vật rắn.
Nguyên lý lôgic của phương pháp này là thừa nhận rằng nguyên nhân biến đổi tất yếu làm cho kết quả cũng biến đổi theo ít nhiều tương ứng.
4.5 Phương pháp phần dư
Phương pháp phần dư hay là thặng dư có lược đồ lôgic như sau:
Thí dụ, Le Verier nhận thấy quỹ đạo thực của Thiên Vương tinh sai lệch so với tính toán lý thuyết. Kiểm tra kỹ ảnh hưỏng của các hành tinh khác và cả của mặt trời thì đều thấy không phải là nguyên nhân trực tiếp, Le Verier đề ra giả thuyết dựa trên phương pháp phần dư, cho rằng có lẽ tồn tại một hành tinh rất gần Thiên Vương tinh làm sai lệch quỹ dạo của nó. Ông đã dự đoán vị trí của hành tinh giả thuyết này. Và A. Gall đã phát hiện hành tinh giả thuyết đó bằng kính thiên văn (1846), ngày nay có tên gọi là Hải Vương Linh.
Bạn đang đọc nội dung bài viết Java Bài 29: Nạp Chồng Phương Thức (Overloading) trên website Cuocthitainang2010.com. Hy vọng một phần nào đó những thông tin mà chúng tôi đã cung cấp là rất hữu ích với bạn. Nếu nội dung bài viết 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. Chúc bạn một ngày tốt lành!