
Yo, Gen Z-ers! Anh Creyt đây, hôm nay mình cùng bóc tách một khái niệm mà nghe thì khô khan nhưng thực ra lại là 'DNA' của mọi object trong lập trình Java: Field. Cứ coi nó như những mảnh ghép tạo nên cá tính riêng cho từng 'nhân vật' trong thế giới code của chúng ta vậy.
1. Field là gì? Để làm gì? (Giải mã Gen Z Style)
Để dễ hình dung, mấy đứa thử nghĩ về profile TikTok của mình đi. Username, bio, số lượng followers, list các video đã đăng, avatar của bạn – tất cả những thứ đó chính là Field của cái 'object' là TikTokProfile của bạn. Chúng là những dữ liệu, những đặc điểm riêng biệt định hình nên trạng thái của một đối tượng cụ thể.
Trong Java OOP, một Field (hay còn gọi là instance variable hoặc member variable) là một biến được khai báo bên trong một class, nhưng nằm ngoài bất kỳ method, constructor hay block nào. Nhiệm vụ chính của nó là lưu trữ dữ liệu hoặc trạng thái của một đối tượng được tạo ra từ class đó.
Để làm gì? Đơn giản là để các đối tượng có 'cá tính' riêng. Mỗi khi bạn tạo một đối tượng (ví dụ: một TikTokProfile cho bạn, một cái khác cho đứa bạn thân), thì mỗi đối tượng đó sẽ có một bộ Field riêng, với những giá trị có thể khác nhau. Profile của bạn có username khác, số followers khác profile của đứa bạn, đúng không? Đó chính là sức mạnh của Fields!
2. Code Ví Dụ Minh Họa: 'Student' Object
Giả sử chúng ta muốn tạo ra một class Student để quản lý thông tin của các bạn sinh viên. Mỗi sinh viên sẽ có tên, tuổi và mã số sinh viên (MSSV). Đây chính là các Fields của class Student.
class Student {
// Đây là các "Field" của class Student
String name; // Tên của sinh viên
int age; // Tuổi của sinh viên
String studentId; // Mã số sinh viên
boolean isStudying; // Trạng thái đang học hay không
// Constructor để khởi tạo đối tượng Student
public Student(String name, int age, String studentId) {
this.name = name; // Gán giá trị từ tham số vào field 'name'
this.age = age;
this.studentId = studentId;
this.isStudying = true; // Mặc định khi tạo là đang học
}
// Một method để in thông tin của sinh viên
public void displayInfo() {
System.out.println("Tên: " + name + ", Tuổi: " + age + ", MSSV: " + studentId + ", Đang học: " + isStudying);
}
// Một method để thay đổi trạng thái học tập
public void stopStudying() {
this.isStudying = false;
System.out.println(name + " đã tạm dừng việc học.");
}
}
public class SchoolApp {
public static void main(String[] args) {
// Tạo một đối tượng Student (Nguyễn Văn A)
Student studentA = new Student("Nguyễn Văn A", 20, "SV001");
studentA.displayInfo(); // Output: Tên: Nguyễn Văn A, Tuổi: 20, MSSV: SV001, Đang học: true
// Tạo một đối tượng Student khác (Trần Thị B)
Student studentB = new Student("Trần Thị B", 21, "SV002");
studentB.displayInfo(); // Output: Tên: Trần Thị B, Tuổi: 21, MSSV: SV002, Đang học: true
// Thay đổi giá trị của một field cho studentA thông qua method
studentA.stopStudying(); // Output: Nguyễn Văn A đã tạm dừng việc học.
studentA.displayInfo(); // Output: Tên: Nguyễn Văn A, Tuổi: 20, MSSV: SV001, Đang học: false
// Field 'isStudying' của studentB vẫn không bị ảnh hưởng
studentB.displayInfo(); // Output: Tên: Trần Thị B, Tuổi: 21, MSSV: SV002, Đang học: true
}
}
Trong ví dụ trên, name, age, studentId, isStudying là các Fields. Mỗi khi tạo studentA hay studentB, chúng ta có hai bộ Fields riêng biệt, lưu trữ thông tin độc lập cho từng đối tượng.

3. Mẹo hay & Best Practices (Để code đỉnh của chóp)
Với tư cách là một giảng viên lão luyện từ Harvard (phiên bản Creyt), anh có vài tips vàng cho mấy đứa:
-
Encapsulation (Đóng gói) là chân ái: Luôn luôn đặt
privatecho các Fields của mình. Sau đó, cung cấp cácpublicgetter(để đọc giá trị) vàsetter(để thay đổi giá trị) methods. Tại sao? Nó giống như việc bạn có một căn phòng riêng vậy: bạn không muốn ai đó tự ý vào lục lọi đồ đạc của mình, đúng không? Bạn có thể cho họ biết có gì trong phòng (getter) hoặc cho phép họ đặt đồ vào (setter) nhưng phải thông qua bạn. Điều này giúp kiểm soát dữ liệu, tránh việc dữ liệu bị 'rác' hoặc thay đổi không mong muốn. Đây là một trong bốn trụ cột của OOP đó! -
finalfields: Bất biến là đẹp: Nếu một Field mà giá trị của nó không bao giờ thay đổi sau khi khởi tạo (ví dụ:studentIdsau khi được cấp), hãy khai báo nó làfinal. Điều này giúp code của bạn an toàn hơn, dễ đọc hơn và thể hiện rõ ý định của bạn. -
Tên Field phải rõ ràng: Đặt tên Field dễ hiểu, theo quy tắc
camelCase(ví dụ:userName,productPrice). Đừng đặta,b,x... trừ khi đó là các biến tạm thời trong method. Code không chỉ để máy hiểu, mà còn để con người (và cả Creyt nữa) đọc được!
-
Static Fields (Biến Class): Có một loại Field đặc biệt là
static. Chúng không thuộc về từng đối tượng cụ thể mà thuộc về chính cái class đó. Ví dụ, nếu bạn có một FieldString schoolName = "Đại học Harvard";trong classStudentmà làstatic, thì tất cả các đối tượngStudentđều chia sẻ cùng một giá trịschoolNamenày. Giống như tên trường học, tất cả học sinh đều thuộc cùng một trường vậy. Chỉ dùngstatickhi Field đó là chung cho TẤT CẢ các thể hiện của class.
4. Học thuật Harvard, Dễ hiểu Tuyệt đối
Từ góc độ học thuật sâu sắc, Fields đóng vai trò cực kỳ quan trọng trong việc hiện thực hóa các nguyên lý cơ bản của Lập trình hướng đối tượng (OOP):
- Abstraction (Trừu tượng hóa): Fields cho phép chúng ta trừu tượng hóa các đặc tính quan trọng nhất của một thực thể trong thế giới thực thành các thuộc tính trong code. Chúng ta không cần mô tả mọi chi tiết nhỏ nhất, mà chỉ những gì cần thiết để định nghĩa đối tượng đó trong ngữ cảnh của ứng dụng.
- State vs. Behavior: Trong OOP, một đối tượng được định nghĩa bởi state (trạng thái) và behavior (hành vi). Fields chính là thứ đại diện cho state của đối tượng, cho nó 'tính cách' và 'dữ liệu' riêng. Các methods (hành vi) sau đó sẽ thao tác với các Fields này. Sự kết hợp hài hòa giữa Fields và Methods tạo nên một đối tượng hoàn chỉnh và có ý nghĩa.
- Memory Management: Mỗi khi một đối tượng được tạo ra (instantiated), một vùng nhớ riêng biệt sẽ được cấp phát trên heap để lưu trữ các Fields của nó. Điều này đảm bảo rằng mỗi đối tượng có một bản sao độc lập của các thuộc tính, cho phép chúng có những giá trị và trạng thái riêng biệt mà không ảnh hưởng lẫn nhau.
5. Ví Dụ Thực Tế: Ứng Dụng/Website đã dùng
Fields là xương sống của mọi ứng dụng. Không có nó, mọi thứ sẽ sụp đổ:
- Facebook/Instagram:
Userobject: có các fields nhưuserId,username,email,profilePictureUrl,followersCount,postsList(một list cácPostobjects).Postobject: cópostId,authorId,imageUrl,caption,likesCount,commentsList.
- E-commerce (Shopee/Lazada):
Productobject: cóproductId,name,price,description,stockQuantity,sellerId,category.Userobject: cóuserId,username,address,paymentMethods(list cácPaymentMethodobjects).
- Game (Liên Minh Huyền Thoại):
Championobject: cóname,health,mana,attackDamage,abilityList.Playerobject: cóplayerName,score,championPicked(là mộtChampionobject).
Mỗi lần bạn xem profile, thêm sản phẩm vào giỏ hàng, hoặc chọn tướng trong game, bạn đang tương tác với các Fields của những đối tượng đó đấy!
6. Thử Nghiệm & Hướng Dẫn Sử Dụng
Khi nào nên dùng Field?
- Khi bạn cần lưu trữ dữ liệu riêng biệt cho mỗi thể hiện (instance) của một đối tượng. Ví dụ: mỗi
Studentcần cónamevàageriêng. - Khi dữ liệu đó định nghĩa trạng thái của đối tượng và có thể thay đổi trong suốt vòng đời của đối tượng. Ví dụ:
isStudyingcủa sinh viên có thể thay đổi từtruesangfalse. - Khi dữ liệu đó là một đặc tính cốt lõi, gắn liền với bản chất của đối tượng.
Thử nghiệm tại nhà:
Hãy thử tạo một class Car với các fields sau:
String brand;String model;int year;String color;double currentSpeed;
- Tạo 2-3 đối tượng
Car(ví dụ:carA,carB), gán các giá trị khác nhau cho các fields của chúng. In thông tin của từng chiếc xe ra console. - Thử thay đổi
currentSpeedcủacarA(ví dụ: tăng lên 60 km/h) và sau đó in lại thông tin của cảcarAvàcarB. Bạn sẽ thấycarBkhông bị ảnh hưởng, vì mỗi chiếc xe có bộ fieldscurrentSpeedriêng. - Thêm một field
static final int NUMBER_OF_WHEELS = 4;vào classCar. Sau đó, thử truy cậpCar.NUMBER_OF_WHEELSvà in ra. Bạn sẽ thấy nó là 4 cho tất cả các đối tượngCarmà không cần phải tạo đối tượng. Đây là cách Fieldsstatichoạt động.
Việc thực hành này sẽ giúp bạn 'cảm' được sự khác biệt và tầm quan trọng của Fields trong việc định hình các đối tượng trong lập trình hướng đối tượng. Nhớ nhé, Fields là trái tim dữ liệu của mọi object!
Thuộc Series: Java – OOP
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!