Skip to content

Commit 05ca698

Browse files
committed
big update, new chapter, more parts
1 parent 0f6b505 commit 05ca698

29 files changed

+367
-31
lines changed
File renamed without changes.

.vscode/settings.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{
22
"java.project.sourcePaths": [
33
"src",
4-
"3. Data Structures and Algorithms",
5-
"2. Object-oriented Programming Principles",
6-
"1. Introduction",
7-
"4. My Projects"
4+
"1. The Java Language",
5+
"2. Classes in Java",
6+
"3. Core Ultilities",
7+
"4. IO Facilities",
8+
"5. Data Structures and Algorithms",
9+
"6. Network Programming",
810
],
911
"java.project.outputPath": "bin",
1012
"java.project.referencedLibraries": [
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

2. Classes in Java/Callback.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Callback (gọi lại) là một cơ chế trong lập trình cho phép một đối tượng truyền tham chiếu đến một
2+
// hoặc nhiều phương thức của nó cho một đối tượng khác, để sau này đối tượng được gọi có thể gọi lại các phương thức đó.
3+
// Hiểu đơn giản là, truyền một phương thức vào một phương thức khác để thực thi nó sau này.
4+
/*
5+
* - Đây là một phương pháp thường được sử dụng trong các ngôn ngữ như C hay C++ thông qua con trỏ hàm,
6+
* nhưng trong Java, cách tiếp cận này được thực hiện bằng cách sử dụng interfaces.
7+
* - Callback giúp chúng ta giảm sự phụ thuộc giữa các đối tượng với nhau, giúp chúng ta dễ dàng mở rộng
8+
* ứng dụng của mình hơn.
9+
*/
10+
11+
// Ví dụ:
12+
13+
// Định nghĩa interface TaskListener với phương thức onTaskCompleted() để xử lý kết quả trả về từ một Task nào đó.
14+
interface TaskListener {
15+
void onTaskCompleted(String result);
16+
}
17+
18+
// Tạo class Task mà sẽ sử dụng interface TaskListener để thông báo cho đối
19+
// tượng khác khi nó hoàn thành công việc.
20+
class Task {
21+
private TaskListener listener;
22+
23+
public void setTaskListener(TaskListener listener) {
24+
this.listener = listener;
25+
}
26+
27+
public void completeTask() {
28+
// Do something
29+
// Sau khi hoàn thành công việc, gọi phương thức onTaskCompleted() của interface
30+
// TaskListener
31+
if (listener != null) {
32+
listener.onTaskCompleted("Task completed");
33+
}
34+
}
35+
}
36+
37+
// Triển khai class Application mà triển khai interface TaskListener và đăng ký
38+
// nhận sự kiện từ Task.
39+
class Application implements TaskListener {
40+
@Override
41+
public void onTaskCompleted(String result) {
42+
System.out.println("Notification from Task:: " + result);
43+
}
44+
45+
public static void main(String[] args) {
46+
47+
Task task = new Task();
48+
Application app = new Application();
49+
50+
// Đăng ký nhận sự kiện từ Task
51+
task.setTaskListener(app);
52+
53+
// Thực thi Task
54+
task.completeTask();
55+
}
56+
}
57+
58+
// Trong ví dụ này:
59+
/*
60+
* - TaskListener là interface chứa phương thức onTaskCompleted() để xử lý kết
61+
* quả trả về từ Task.
62+
* - Task là class chứa phương thức completeTask() để thực thi công việc và
63+
* thông báo kết quả trả về thông qua interface TaskListener.
64+
* - Application là class triển khai interface TaskListener để xử lý kết quả trả
65+
* về từ Task.
66+
*/
67+
68+
// Như vậy, interface TaskListener có ý nghĩa:
69+
/*
70+
* - Task không cần biết đối tượng nào sẽ xử lý kết quả trả về của nó.
71+
* - Task chỉ cần gọi phương thức onTaskCompleted() của interface TaskListener
72+
* để thông báo kết quả trả về.
73+
* - Application sẽ triển khai interface TaskListener để xử lý kết quả trả về từ
74+
* Task.
75+
* -> Từ đó, chúng ta có thể dễ dàng thay đổi hoặc mở rộng ứng dụng mà không cần
76+
* sửa đổi Task.
77+
* -> Callback giúp chúng ta giảm sự phụ thuộc giữa các đối tượng với nhau, giúp
78+
* chúng ta dễ dàng mở rộng ứng dụng của mình hơn.
79+
*/
80+
81+
public class Callback {
82+
public static void main(String[] args) {
83+
Application.main(args);
84+
}
85+
}

2. Classes in Java/InnerClass.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
public class InnerClass {
2+
3+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Một interface có thể chứa các biến, nhưng các biến này mặc định là public, static và final;
2+
/*
3+
* - Các biến này có thể được tham chiếu trực tiếp thông qua tên của interface.
4+
* - Các biến này xuất hiện trong tất cả các class implement interface đó.
5+
*/
6+
7+
// Ví dụ:
8+
interface Scaleable {
9+
static final int BIG = 0, MEDIUM = 1, SMALL = 2;
10+
11+
void setScale(int size);
12+
}
13+
14+
class Box implements Scaleable {
15+
private int size;
16+
17+
@Override
18+
public void setScale(int size) {
19+
switch (size) {
20+
case BIG:
21+
this.size = 100;
22+
break;
23+
case MEDIUM:
24+
this.size = 50;
25+
break;
26+
case SMALL:
27+
this.size = 25;
28+
break;
29+
default:
30+
System.out.println("Invalid size");
31+
}
32+
}
33+
34+
public void printSize() {
35+
System.out.println("Size: " + size);
36+
}
37+
}
38+
39+
public class InterfaceVariables {
40+
public static void main(String[] args) {
41+
Box box = new Box();
42+
box.setScale(Scaleable.BIG);
43+
box.printSize(); // Size: 100
44+
}
45+
}
46+
47+
// Interfaces trong lập trình hướng đối tượng nên chỉ được sử dụng để định nghĩa
48+
// hành vi, không phải để lưu trữ trạng thái hay dữ liệu cụ thể. Việc sử dụng
49+
// interfaces để chứa biến (các hằng số) làm mờ đi mục đích chính của chúng và
50+
// có thể dẫn đến một thiết kế không sạch sẽ, khiến cho các hằng số và hành vi
51+
// được gói gọn cùng nhau một cách không cần thiết.
52+
53+
/*
54+
* - Tất cả biến trong interface đều là public static final. Điều này có nghĩa
55+
* là
56+
* chúng luôn luôn công khai và có sẵn cho bất kỳ ai sử dụng interface. Điều này
57+
* cản trở khả năng đóng gói, khiến cho việc quản lý trạng thái của chương trình
58+
* trở nên khó khăn hơn.
59+
* - Việc mỗi lớp thực thi một interface kế thừa toàn bộ các hằng số có thể gây
60+
* rối loạn API của lớp đó, khiến cho API bao gồm nhiều thành phần không cần
61+
* thiết
62+
*/
63+
64+
// -> Tóm lại, không nên sử dụng interface để chứa biến, hãy sử dụng class hoặc
65+
// enum thay thế.

2. Classes in Java/NestedClass.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.util.HashMap;
2+
import java.util.ArrayList;
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
// Lớp chồng nhau (nested class) là một lớp được định nghĩa bên trong một lớp khác.
7+
8+
// Ví dụ:
9+
class ContactBook {
10+
public List<Contact> contacts = new ArrayList<>();
11+
public Map<String, Group> groups = new HashMap<>();
12+
13+
class Contact {
14+
private String name;
15+
private String phone;
16+
17+
public Contact(String name, String phone) {
18+
this.name = name;
19+
this.phone = phone;
20+
}
21+
22+
public void displayContact() {
23+
System.out.println("Name: " + name + ", Phone: " + phone);
24+
}
25+
}
26+
27+
static class Group {
28+
String name;
29+
List<String> members = new ArrayList<>();
30+
31+
public Group(String name) {
32+
this.name = name;
33+
}
34+
35+
public void addMember(String contactName) {
36+
members.add(contactName);
37+
}
38+
39+
public void displayGroup() {
40+
System.out.println("Group: " + name);
41+
System.out.println("Members:");
42+
for (String member : members) {
43+
System.out.println(member);
44+
}
45+
}
46+
}
47+
48+
public void addContact(String name, String phone) {
49+
Contact contact = new Contact(name, phone);
50+
contacts.add(contact);
51+
}
52+
53+
public void addGroup(String name) {
54+
Group group = new Group(name);
55+
groups.put(name, group);
56+
}
57+
}
58+
59+
public class NestedClass {
60+
public static void main(String[] args) {
61+
ContactBook myBook = new ContactBook();
62+
myBook.addContact("Alice", "1234567890");
63+
myBook.addContact("Bob", "0987654321");
64+
65+
myBook.addGroup("Friends");
66+
myBook.groups.get("Friends").addMember("Alice");
67+
myBook.groups.get("Friends").addMember("Bob");
68+
69+
for (ContactBook.Contact contact : myBook.contacts) {
70+
contact.displayContact();
71+
}
72+
73+
myBook.groups.get("Friends").displayGroup();
74+
}
75+
}

2. Classes in Java/SubInterface.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// Một interface có thể extends một hoặc nhiều interface khác.
2+
// Điều này giúp chúng ta tạo ra một cấu trúc phân cấp của các interface, giúp chúng ta quản lý và sắp xếp các hành vi một cách có tổ chức.
3+
4+
/*
5+
* - Lưu ý, khác với class chỉ kế thừa từ một class cha duy nhất, một class có thể
6+
* implements nhiều interface; còn một interface có thể extends nhiều interface khác.
7+
* - Một interface không thể kế thừa từ class khác.
8+
* - Một class implement một interface thì cũng phải implement tất cả interface mà
9+
* interface đó extends.
10+
*/
11+
12+
// Ví dụ:
13+
14+
// Interface Vehicle định nghĩa các hành vi cơ bản của một phương tiện giao thông.
15+
interface Vehicle {
16+
void start();
17+
18+
void stop();
19+
}
20+
21+
// Interface FlyingVehicle định nghĩa các hành vi của một phương tiện bay.
22+
interface FlyingVehicle extends Vehicle {
23+
void fly();
24+
25+
void land();
26+
}
27+
28+
// Interface LandVehicle định nghĩa các hành vi của một phương tiện đường bộ.
29+
interface LandVehicle extends Vehicle {
30+
void drive();
31+
32+
void brake();
33+
}
34+
35+
// Interface AmphibiousVehicle kế thừa từ cả FlyingVehicle và LandVehicle, định
36+
// nghĩa
37+
// thêm hành vi floatOnWater().
38+
interface AmphibiousVehicle extends FlyingVehicle, LandVehicle {
39+
void floatOnWater();
40+
}
41+
42+
// Lớp HybridDrone thực thi interface AmphibiousVehicle.
43+
// -> Nó phải override tất cả các phương thức của các interface mà nó implement.
44+
class HybridDrone implements AmphibiousVehicle {
45+
@Override
46+
public void start() {
47+
System.out.println("HybridDrone is starting...");
48+
}
49+
50+
@Override
51+
public void stop() {
52+
System.out.println("HybridDrone is stopping...");
53+
}
54+
55+
@Override
56+
public void fly() {
57+
System.out.println("HybridDrone is flying...");
58+
}
59+
60+
@Override
61+
public void land() {
62+
System.out.println("HybridDrone is landing...");
63+
}
64+
65+
@Override
66+
public void drive() {
67+
System.out.println("HybridDrone is driving...");
68+
}
69+
70+
@Override
71+
public void brake() {
72+
System.out.println("HybridDrone is braking...");
73+
}
74+
75+
@Override
76+
public void floatOnWater() {
77+
System.out.println("HybridDrone is floating on water...");
78+
}
79+
}
80+
81+
public class SubInterface {
82+
public static void main(String[] args) {
83+
HybridDrone drone = new HybridDrone();
84+
drone.start();
85+
drone.fly();
86+
drone.land();
87+
drone.drive();
88+
drone.brake();
89+
drone.floatOnWater();
90+
drone.stop();
91+
}
92+
}

2. Object-oriented Programming Principles/Callback.java

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)