Skip to content

Commit 3b3574d

Browse files
committed
new content
1 parent 7b1836b commit 3b3574d

File tree

6 files changed

+384
-0
lines changed

6 files changed

+384
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// Tiếp tục về nội lớp (inner class).
2+
// 4. Nội lớp vô danh (anonymous inner class):
3+
/*
4+
* - Là một loại nội lớp không có tên, được khai báo và khởi tạo ngay tại chỗ.
5+
* - Dùng khi bạn cần tạo một lớp mà chỉ sử dụng một lần duy nhất.
6+
*/
7+
8+
// Xét ví dụ sau:
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.Iterator;
13+
14+
// Lớp Book chứa thông tin về một cuốn sách (tên sách, tác giả)
15+
class Book {
16+
String title;
17+
String author;
18+
19+
Book(String title, String author) {
20+
this.title = title;
21+
this.author = author;
22+
}
23+
24+
@Override
25+
public String toString() {
26+
return title + " by " + author;
27+
}
28+
}
29+
30+
// Lớp BookList chứa một danh sách các cuốn sách.
31+
class BookList {
32+
private List<Book> books = new ArrayList<>();
33+
34+
public void addBook(Book book) {
35+
books.add(book);
36+
}
37+
38+
public int getSize() {
39+
return books.size();
40+
}
41+
42+
// Nội lớp cung cấp iterator để duyệt qua danh sách các cuốn sách.
43+
public class BookIterator implements Iterator<Book> {
44+
private int index = 0;
45+
46+
@Override
47+
public boolean hasNext() {
48+
return index < books.size();
49+
}
50+
51+
@Override
52+
public Book next() {
53+
return books.get(index++);
54+
}
55+
}
56+
57+
public BookIterator getIterator() {
58+
return new BookIterator();
59+
}
60+
61+
// Sử dụng nội lớp vô danh để tạo một Iterator mới mà không cần phải tạo lớp
62+
// mới.
63+
public Iterator<Book> getReverseIterator() {
64+
return new Iterator<Book>() {
65+
private int index = books.size() - 1;
66+
67+
@Override
68+
public boolean hasNext() {
69+
return index >= 0;
70+
}
71+
72+
@Override
73+
public Book next() {
74+
return books.get(index--);
75+
}
76+
};
77+
// Đây là một nội lớp vô danh, không có tên, được khai báo và khởi tạo ngay
78+
// tại chỗ.
79+
}
80+
}
81+
82+
public class AnonymousInnerClass {
83+
public static void main(String[] args) {
84+
BookList myList = new BookList();
85+
86+
myList.addBook(new Book("The Alchemist", "Paulo Coelho"));
87+
myList.addBook(new Book("The Little Prince", "Antoine de Saint-Exupéry"));
88+
myList.addBook(new Book("The Da Vinci Code", "Dan Brown"));
89+
90+
System.out.println("--Book list:");
91+
92+
// Sử dụng Iterator để duyệt qua danh sách các cuốn sách.
93+
BookList.BookIterator iterator = myList.getIterator();
94+
while (iterator.hasNext()) {
95+
System.out.println(iterator.next());
96+
}
97+
98+
System.out.println("\n--Book list in reverse order:");
99+
100+
// Sử dụng Iterator để duyệt qua danh sách các cuốn sách theo thứ tự ngược lại.
101+
Iterator<Book> reverseIterator = myList.getReverseIterator();
102+
while (reverseIterator.hasNext()) {
103+
System.out.println(reverseIterator.next());
104+
}
105+
}
106+
}

2. Classes in Java/Equals.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Trong Java, equals() là một phương thức của lớp Object được sử dụng để so sánh hai đối tượng.
2+
/*
3+
* - Nó xem xét hai đối tượng là bằng nhau nếu chúng cùng tham chiếu đến cùng một vùng nhớ trong bộ nhớ.
4+
* - Phương thức equals() được ghi đè bởi các lớp con để so sánh dữ liệu của đối tượng.
5+
* - Nếu không ghi đè phương thức này, nó sẽ so sánh hai đối tượng bằng cách so sánh địa chỉ bộ nhớ của chúng.
6+
* -> Kết quả sẽ giống như sử dụng toán tử ==.
7+
*/
8+
9+
// Ví dụ về equals() mặc định:
10+
@SuppressWarnings("unused")
11+
class Student {
12+
private String name;
13+
private int age;
14+
15+
public Student(String name, int age) {
16+
this.name = name;
17+
this.age = age;
18+
}
19+
}
20+
21+
// Nếu ghi đè phương thức equals() để so sánh dữ liệu của đối tượng:
22+
class Teacher {
23+
private String name;
24+
private int age;
25+
26+
public Teacher(String name, int age) {
27+
this.name = name;
28+
this.age = age;
29+
}
30+
31+
// Ghi đè phương thức equals() để so sánh dữ liệu của đối tượng.
32+
@Override
33+
public boolean equals(Object obj) {
34+
// Nếu hai đối tượng cùng tham chiếu đến cùng một vùng nhớ.
35+
if (this == obj) {
36+
return true;
37+
}
38+
39+
// Nếu obj là null hoặc không phải là một instance của lớp Teacher.
40+
if (obj == null || getClass() != obj.getClass()) {
41+
return false;
42+
}
43+
44+
// Ép kiểu obj về lớp Teacher.
45+
Teacher teacher = (Teacher) obj;
46+
return age == teacher.age && name.equals(teacher.name);
47+
}
48+
}
49+
50+
@SuppressWarnings("unlikely-arg-type")
51+
public class Equals {
52+
public static void main(String[] args) {
53+
Student student1 = new Student("Alice", 20);
54+
Student student2 = new Student("Alice", 20);
55+
56+
// So sánh hai đối tượng sử dụng equals() mặc định.
57+
// Kết quả sẽ là false vì không ghi đè phương thức equals().
58+
System.out.println(student1.equals(student2));
59+
60+
// So sánh hai đối tượng sử dụng equals() đã được ghi đè.
61+
// Kết quả sẽ là true vì dữ liệu của hai đối tượng giống nhau.
62+
Teacher teacher1 = new Teacher("Bob", 30);
63+
Teacher teacher2 = new Teacher("Bob", 30);
64+
System.out.println(teacher1.equals(teacher2));
65+
66+
// Nếu so sánh giữa hai đối tượng khác nhau.
67+
System.out.println(teacher1.equals(student1));
68+
// -> false vì student1 không phải là một instance của lớp Teacher.
69+
}
70+
}

2. Classes in Java/EventHandling.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Một tác dụng khác thường thấy của anonymous inner class là xử lý sự kiện (event handling).
2+
/*
3+
* - Sự kiện (event) là một hành động xảy ra trong ứng dụng, ví dụ nhấn nút chuột, gõ phím, kéo thả, ...
4+
* - Event handling là quá trình xử lý các sự kiện này.
5+
* - Trong Java, event handling thường được thực hiện thông qua các listener (người nghe) và adapter (bộ chuyển đổi).
6+
* - Listener là một interface chứa các phương thức để xử lý sự kiện.
7+
* - Adapter là một lớp trung gian giữa listener và component (thành phần) để xử lý sự kiện.
8+
* - Anonymous inner class thường được sử dụng để triển khai listener và adapter một cách nhanh chóng và tiện lợi.
9+
*/
10+
11+
// Xét ví dụ sau:
12+
/*
13+
* - Trong ví dụ này, chúng ta tạo một cửa sổ JFrame với một nút JButton.
14+
* - Khi người dùng nhấn nút, chúng ta muốn in ra màn hình dòng chữ "Button clicked!".
15+
* - Để xử lý sự kiện này, chúng ta sử dụng một anonymous inner class để triển khai ActionListener.
16+
* - ActionListener là một interface trong gói java.awt.event, nó chứa một phương thức actionPerformed() để xử lý sự kiện.
17+
* - Trong anonymous inner class, chúng ta triển khai phương thức actionPerformed() để in ra dòng chữ "Button clicked!".
18+
*/
19+
20+
import java.awt.event.*;
21+
import javax.swing.*;
22+
23+
// Sử dụng nội lớp vô danh để xử lý sự kiện khi người dùng nhấn nút.
24+
public class EventHandling {
25+
public static void main(String[] args) {
26+
// Tạo một cửa sổ JFrame
27+
JFrame frame = new JFrame("Event Handling Example");
28+
29+
// Tạo một nút JButton
30+
JButton button = new JButton("Click Me");
31+
32+
// Thêm nút vào cửa sổ
33+
frame.add(button);
34+
35+
// Đặt kích thước cửa sổ
36+
frame.setSize(300, 200);
37+
38+
// Đặt cửa sổ hiển thị ở giữa màn hình
39+
frame.setLocationRelativeTo(null);
40+
41+
// Đặt cửa sổ hiển thị
42+
frame.setVisible(true);
43+
44+
// Sử dụng nội lớp vô danh để xử lý sự kiện khi người dùng nhấn nút
45+
button.addActionListener(new ActionListener() {
46+
@Override
47+
public void actionPerformed(ActionEvent e) {
48+
System.out.println("Button clicked!");
49+
}
50+
});
51+
}
52+
}
53+
54+
// Tác dụng của nội lớp vô danh trong ví dụ trên:
55+
/*
56+
* - Anonymous inner class này được truyền vào phương thức addActionListener()
57+
* của JButton để xử lý sự kiện khi người dùng nhấn nút.
58+
* - Anonymous inner class giúp viết mã ngắn gọn và dễ hiểu hơn so với việc tạo
59+
* một lớp mới và triển khai ActionListener.
60+
*/

2. Classes in Java/StaticInnerClass.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,87 @@
99
* thay vì phải tạo nhiều lớp độc lập, từ đó làm tăng số lượng lớp trong gói.
1010
*/
1111

12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
// Xét ví dụ sau:
16+
/*
17+
* - Class Department chứa một static inner class Employee.
18+
* - Department quản lý thông tin về một phòng ban trong công ty, bao gồm tên phòng ban và danh sách nhân viên.
19+
* - Employee chứa thông tin về một nhân viên, bao gồm tên, mã số và chức vụ.
20+
*/
21+
22+
class Department {
23+
private String name;
24+
private List<Employee> employees;
25+
26+
public Department(String name) {
27+
this.name = name;
28+
this.employees = new ArrayList<>();
29+
}
30+
31+
public void addEmployee(String empName, String empId, String position) {
32+
Employee newEmployee = new Employee(empName, empId, position);
33+
employees.add(newEmployee);
34+
}
35+
36+
public List<Employee> getEmployees() {
37+
return employees;
38+
}
39+
40+
// Static inner class
41+
public static class Employee {
42+
private String name;
43+
private String id;
44+
private String position;
45+
46+
public Employee(String name, String id, String position) {
47+
this.name = name;
48+
this.id = id;
49+
this.position = position;
50+
}
51+
52+
public String getName() {
53+
return name;
54+
}
55+
56+
public String getId() {
57+
return id;
58+
}
59+
60+
public String getPosition() {
61+
return position;
62+
}
63+
64+
@Override
65+
public String toString() {
66+
return "Employee{" +
67+
"name='" + name + '\'' +
68+
", id='" + id + '\'' +
69+
", position='" + position + '\'' +
70+
'}';
71+
}
72+
}
73+
74+
@Override
75+
public String toString() {
76+
return "Department{" +
77+
"name='" + name + '\'' +
78+
", employees=" + employees +
79+
'}';
80+
}
81+
}
82+
1283
public class StaticInnerClass {
84+
public static void main(String[] args) {
85+
Department itDepartment = new Department("IT");
86+
itDepartment.addEmployee("John", "0001", "Developer");
87+
itDepartment.addEmployee("Jane", "0002", "Designer");
88+
89+
System.out.println(itDepartment);
1390

91+
// Khởi tạo Employee không thông qua Department
92+
Department.Employee manager = new Department.Employee("Alice", "0010", "Manager");
93+
System.out.println("Manager: " + manager);
94+
}
1495
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Trong Java, mọi lớp đều kế thừa từ lớp Object.
2+
/* - Lớp Object là lớp cha của tất cả các lớp trong Java.
3+
* - Nó chứa các phương thức mà mọi lớp kế thừa từ nó.
4+
* - Lớp Object cung cấp một số phương thức mặc định, nhưng chúng có thể được ghi đè bởi các lớp con để cung cấp cài đặt cụ thể.
5+
* - Dưới đây là một số phương thức static quang trọng của lớp Object:
6+
* + Object clone(): Trả về một bản sao của đối tượng hiện tại.
7+
* + boolean equals(Object obj): So sánh hai đối tượng.
8+
* + void finalize(): Được gọi trước khi một đối tượng bị thu hồi bởi garbage collector.
9+
* + Class<?> getClass(): Trả về đối tượng Class của đối tượng hiện tại.
10+
* + int hashCode(): Trả về mã băm của đối tượng.
11+
* + void notify(): Thức tỉnh một luồng đang chờ đợi trên đối tượng hiện tại.
12+
* + void notifyAll(): Thức tỉnh tất cả các luồng đang chờ đợi trên đối tượng hiện tại.
13+
* + String toString(): Trả về chuỗi biểu diễn của đối tượng.
14+
* + void wait(): Chờ cho đến khi một luồng khác gọi notify() hoặc notifyAll() trên đối tượng hiện tại.
15+
*/
16+
17+
// Ví dụ về phương thức toString():
18+
class Student {
19+
private String name;
20+
private int age;
21+
22+
public Student(String name, int age) {
23+
this.name = name;
24+
this.age = age;
25+
}
26+
27+
// Ghi đè phương thức toString() để trả về thông tin của đối tượng.
28+
@Override
29+
public String toString() {
30+
return "Student [name=" + name + ", age=" + age + "]";
31+
}
32+
}
33+
34+
@SuppressWarnings("unused")
35+
class Teacher {
36+
private String name;
37+
private int age;
38+
39+
public Teacher(String name, int age) {
40+
this.name = name;
41+
this.age = age;
42+
}
43+
}
44+
45+
public class TheObjectClass {
46+
public static void main(String[] args) {
47+
Student student = new Student("Alice", 20);
48+
System.out.println(student.toString());
49+
50+
// Lớp Object cung cấp phương thức toString() mặc định.
51+
// Khi không ghi đè phương thức này,
52+
// kết quả sẽ là: <tên gói>.<tên lớp>@<địa chỉ bộ nhớ>
53+
Object obj = new Object();
54+
System.out.println(obj.toString());
55+
56+
Teacher teacher = new Teacher("Bob", 30);
57+
System.out.println(teacher.toString());
58+
}
59+
}

0 commit comments

Comments
 (0)