Xem Nhiều 2/2023 #️ Java Bài 29: Nạp Chồng Phương Thức (Overloading) # Top 4 Trend | Sansangdethanhcong.com

Xem Nhiều 2/2023 # Java Bài 29: Nạp Chồng Phương Thức (Overloading) # Top 4 Trend

Cập nhật thông tin chi tiết về Java Bài 29: Nạp Chồng Phương Thức (Overloading) mới nhất trên website Sansangdethanhcong.com. 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.

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.

Overriding Và Overloading Trong Java

Dẫn nhập

Trong bài trước, Kteam đã giới thiệu các bạn về SETTER & GETTER trong lập trình hướng đối tượng. Ở bài này, chúng ta sẽ tìm hiểu về overriding và overloading trong Java.

Nội dung

Để đọc hiểu bài này, tốt nhất các bạn nên có kiến thức cơ bản về các phần sau:

Bài này chúng ta sẽ tìm hiểu những vấn đề sau:

Overriding là gì? Cách sử dụng

Overloading là gì? Cách sử dụng

Overriding là gì? Cách sử dụng

Overriding (ghi đè) có nghĩa là có 2 phương thức giống nhau về tên và tham số truyền vào. Một phương thức ở lớp cha, còn cái kia ở lớp con. Overriding  cho phép lớp con có thể thực hiện riêng biệt cho phương thức mà lớp cha đã cung cấp.

Ví dụ: Như trong bài trước ta tạo lớp Student kế thừa lớp Person. Với phương thức getInfo của lớp Person chỉ in được thông tin name, age, height trong khi lớp Student còn có thuộc tính universityName. Như vậy, ta sẽ overriding lại phương thức getInfo:

public class Student extends Person { public String universityName; public Student(String name, int age, float height, String universityName) { super(name, age, height); this.universityName = universityName; } public void getInfo() { super.getInfo(); System.out.println("University Name:"+this.universityName); } }

Khi ta khai báo phương thức getInfo trong lớp Student, có nghĩa ta đang overrding. Và đối tượng thuộc lớp Student sẽ gọi phương thức getInfo từ lớp Student thay vì lớp Person.

Cách chống Overriding

Nếu không muốn lớp con có thể Overriding lại phương thức nào đó, ta sẽ sử dụng từ khóa final

public final void getInfo() { System.out.println("Name:"+this.name); System.out.println("Age:"+this.age); System.out.println("Height:"+this.height); }

Lớp con sẽ không thể Overriding được phương thức getInfo()

Overloading là gì? Cách sử dụng

Overloading là nhiều phương thức trong một lớp có chung tên nhưng khác tham số truyền vào

Ví dụ: với setter cho thuộc tính age, có thể người dùng truyền vào tham số age là kiểu int, kiểu byte, short hoặc long. Như vậy, ta sẽ Overloading nhiều phương thức setter cho thuộc tính age để đảm bảo.

public class Person { public String name; private int age; public float height; public Person(String name, int age, float height) { this.name = name; this.age = age; this.height = height; } public void setAge(int age) { this.age = age; } } public void setAge(byte age) { this.age = age; } } public void setAge(short age) { this.age = age; } } public void setAge(long age) { this.age = (int) age; } } public int getAge() { return this.age; } public Person clone() { Person other = new Person(this.name, chúng tôi this.height); return other; } public void getInfo() { System.out.println("Name:"+this.name); System.out.println("Age:"+this.age); System.out.println("Height:"+this.height); } }

Giờ ta sẽ kiểm tra trong chương trình main:

public class HelloWorld { public static void main(String[] args) { Person a = new Person("Chau", 21, 1.7f); byte b = 20; a.setAge(b); System.out.println(a.getAge()); short c = 21; a.setAge(c); System.out.println(a.getAge()); int d = 22; a.setAge(d); System.out.println(a.getAge()); long e = 23; a.setAge(e); System.out.println(a.getAge()); } }

Kết

Như vậy chúng ta đã tìm hiểu overriding và overloading trong lập trình hướng đối tượng

Ở bài sau, Kteam sẽ giới thiệu đến bạn về TÍNH TRỪU TRƯỢNG TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện chúng tôi để nhận được sự hỗ trợ từ cộng đồng.

Phương Thức Equals() Và Hashcode() Trong Java

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

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ử ==.

package vn.viettuts; public class EqualExample1 { public static void main(String[] args) { String s1 = new String("This is a string"); String s2 = new String("This is a string"); System.out.println("s1 == s2: " + (s1 == s2)); System.out.println("s1.equals(s2): " + (s1.equals(s2))); } }

Kết quả:

s1 == s2: false s1.equals(s2): true

So 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:

package vn.viettuts; public class Student { private String id; private String name; private String email; private int age; public Student(String id, String name, String email, int age) { chúng tôi = id; chúng tôi = name; this.email = email; chúng tôi = age; } public String toString() { String studentInfo = "Student " + id; studentInfo += ": " + name; studentInfo += " - " + email; studentInfo += " - " + age; return studentInfo; } public boolean equals(Object obj) { if (obj instanceof Student) { Student another = (Student) obj; if (this.id.equals(another.id) && this.name.equals(another.name) && this.email.equals(another.email) && chúng tôi == chúng tôi { return true; } } return false; } }

Tạo ra lớp chúng tôi để kiểm tran phương thức equal() trong lớp Student.

package vn.viettuts; public class EqualStudent { public static void main(String[] args) { Student student1 = new Student("123", "Cong", "cong@gmail.com", 22); Student student2 = new Student("123", "Cong", "cong@gmail.com", 22); Student student3 = new Student("456", "Dung", "dung@gmail.com", 18); System.out.println("student1 == student2: " + (student1 == student2)); System.out.println("student1.equals(student2): " + (student1.equals(student2))); System.out.println("student2.equals(student3): " + (student2.equals(student3))); } }

Kết quả:

student1 == student2: false student1.equals(student2): true student2.equals(student3): false

Ví 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:

package vn.viettuts; public class Student { private String id; private String name; private String email; private int age; public Student(String id) { chúng tôi = id; } public Student(String id, String name, String email, int age) { chúng tôi = id; chúng tôi = name; this.email = email; chúng tôi = age; } public String toString() { String studentInfo = "Student " + id; studentInfo += ": " + name; studentInfo += " - " + email; studentInfo += " - " + age; return studentInfo; } public boolean equals(Object obj) { if (obj instanceof Student) { Student another = (Student) obj; if (this.id.equals(another.id)) { return true; } } return false; } }

Ở đâ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).

package vn.viettuts; import java.util.ArrayList; import java.util.List; public class EqualStudent2 { public static void main(String[] args) { Student student1 = new Student("123", "Cong", "cong@gmail.com", 22); Student student2 = new Student("123", "Cong", "cong@gmail.com", 22); Student student3 = new Student("456", "Dung", "dung@gmail.com", 18); listStudents.add(student1); listStudents.add(student2); listStudents.add(student3); Student searchStudent1 = new Student("123"); Student searchStudent4 = new Student("789"); System.out.println("Search student1: " + listStudents.contains(searchStudent1)); System.out.println("Search student4: " + listStudents.contains(searchStudent4)); } }

Kết quả:

Search student1: true Search student4: false

Phương thức hashCode() trong Java

Định nghĩa phương thức hashCode() trong lớp Object:

public native int hashCode();

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 chúng tôi

package vn.viettuts; public class Student { private String id; private String name; private String email; private int age; public Student(String id) { chúng tôi = id; } public Student(String id, String name, String email, int age) { chúng tôi = id; chúng tôi = name; this.email = email; chúng tôi = age; } public String toString() { String studentInfo = "Student " + id; studentInfo += ": " + name; studentInfo += " - " + email; studentInfo += " - " + age; return studentInfo; } public boolean equals(Object obj) { if (obj instanceof Student) { Student another = (Student) obj; if (this.id.equals(another.id)) { return true; } } return false; } }

Lớp EqualStudent3 .java

package vn.viettuts; import java.util.HashSet; import java.util.Set; public class EqualStudent3 { public static void main(String[] args) { Student student1 = new Student("123", "Cong", "cong@gmail.com", 22); Student student2 = new Student("123", "Cong", "cong@gmail.com", 22); Student student3 = new Student("456", "Dung", "dung@gmail.com", 18); setStudents.add(student1); setStudents.add(student2); setStudents.add(student3); for (Student student : setStudents) { System.out.println(student); } } }

Kết quả:

Student 456: Dung - dung@gmail.com - 18 Student 123: Cong - cong@gmail.com - 22 Student 123: Cong - cong@gmail.com - 22

Hã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:

public int hashCode() { return 31 + id.hashCode(); }

Kết quả:

Student 123: Cong - cong@gmail.com - 22 Student 456: Dung - dung@gmail.com - 18

Good! 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:

Student searchStudent = new Student("456"); boolean found = setStudents.contains(searchStudent); System.out.println("Search student: " + found);

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ả.

Tham khảo

https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode–

Bài Tập Chứng Minh Quy Nạp

PHƯƠNG PHÁP QUY NẠP TOÁN HỌC :

I. Chứng minh rằng ta luôn có các đẳng thức sau : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. II. Chứng minh rằng ta luôn có : 1. chia hết cho 3 2. chia hết cho 6 3. chia hết cho 6 4. chia hết cho 5 5. chia hết cho 3 6. chia hết cho 225 7. chia hết cho 9 8. chia hết cho 27 9. chia hết cho 11 10. chia hết cho 5 11. chia hết cho 19 12. chia hết cho 24 13. chia hết cho 64 14. chia hết cho 35 15. chia hết cho 25 16. chia hết cho 23 17. chia hết cho 918. chia hết cho 64 19. chia hết cho 2420. chia hết cho 621. chia hết cho 133III. Cho số thực Chứng minh rằng ta luôn có : 1. 2. IV. Cho số thực Chứng minh rắng : , V. Chứng minh rằng với mọi số nguyên dương n, ta luôn có bđt : 1. 2. 3. VI. Chứng minh rằng với mọi số nguyên dương ta luôn có :

VII. Cho n là một số nguyên lớn hơn 1. Hãy chứng minh bđt :

IX. Chứng minh rằng với mọi số tự nhiên ta luôn có đẳng thức :

X. Chứng minh rằng với mọi số tự nhiên ta có :

XI. Chứng minh rằng với mọi số tự nhiên ta có : 1. 2. XII. Chứng minh rằng với mọi số nguyên thì : chia hết cho 169XIII. 1. Tính tổng : 2. Tính tổng : BÀI TẬP VỀ DÃY SỐ :

I. Tìm 5 số hạng đầu tiên của mỗi dãy số sau : 1. Dãy số với 2. Dãy số với 3. Dãy số với II. Tìm 6 số hạng đầu tiên của mỗi dãy số sau :Dãy số với Dãy số với III. Cho dãy số với Hãy điền các số thích hợp vào các ô trống sau đây :

un

IV. Trong mặt phẳng toạ độ Oxy, cho hàm số có đồ thị (C).Với mỗi số nguyên dương n, gọi là giao điểm của (C) với đường thẳng d : Xét dãy số với là tung độ của điểm Hãy tìm công thức xác định công thức tổng quát của dãy số đó .V. Hãy xét tính đơn điệu của các dãy số sau : 1. Dãy số với 2. Dãy số với 3. Dãy số với 4. Dãy số với 5. Dãy số với 6. Dãy số với 7. Dãy số với 8. Dãy số với VI. Xác định số thực a để dãy số với là :Một dãy số tăng . 2. Một dãy số giảm.VII. Chứng minh rằng : dãy số với là một dãy số bị chặn.VIII. CMR : dãy số với là một dãy số tăng và bị chặn.IX. Cho dãy số với Hãy tính : , , , Dự đoán công thức của số hạng tổng quát và chứng minh công

Bạn đang xem bài viết Java Bài 29: Nạp Chồng Phương Thức (Overloading) trên website Sansangdethanhcong.com. 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. Chúc bạn một ngày tốt lành!