
Chào các 'dev-tuber' tương lai! Anh Creyt lại lên sóng đây, và hôm nay chúng ta sẽ 'unboxing' một khái niệm cực kỳ cơ bản nhưng lại là xương sống của mọi 'creature' trong thế giới lập trình hướng đối tượng (OOP) Java: đó là Field.
Field là gì? 'Hồ sơ cá nhân' của mọi đối tượng
Bạn cứ hình dung thế này: mỗi khi bạn tạo một nhân vật trong game RPG, bạn sẽ có một cái 'profile' riêng cho nhân vật đó đúng không? Nào là tên, cấp độ, chỉ số sức mạnh, máu, mana... Mỗi nhân vật có những giá trị này riêng biệt. Hoặc đơn giản hơn, trên Facebook, mỗi tài khoản của bạn có tên, ảnh đại diện, danh sách bạn bè, bài đăng riêng.
Trong Java OOP, một Field chính là những 'thông tin cá nhân', 'đặc điểm', hay 'dữ liệu' mà mỗi 'nhân vật' (hay còn gọi là đối tượng - object) của bạn sở hữu. Nó là một biến được khai báo bên trong một lớp (class) nhưng nằm ngoài bất kỳ phương thức (method), constructor hay khối lệnh (block) nào. Mục đích chính của nó là để lưu trữ trạng thái (state) của đối tượng đó.
Nói cách khác, nếu Class là một bản thiết kế (blueprint) để tạo ra các đối tượng, thì Fields chính là những 'ô trống' trong bản thiết kế đó mà mỗi đối tượng được tạo ra sẽ điền vào bằng những giá trị riêng của mình. Ví dụ, bản thiết kế 'SinhVien' có các ô trống 'ten', 'maSinhVien', 'diemTrungBinh'. Khi bạn tạo sinh viên 'An', 'Bình', 'Cường', mỗi người sẽ có tên, mã và điểm riêng biệt.
Code Ví Dụ: Tạo 'profile' cho sinh viên
Để các bạn dễ hình dung, hãy cùng 'code' một lớp SinhVien với các Field cơ bản nhé:
public class SinhVien {
// Đây là các FIELD của lớp SinhVien
String ten;
String maSinhVien;
double diemTrungBinh;
static String tenTruong = "Đại học Creyt"; // Một static field
// Constructor để khởi tạo đối tượng SinhVien
public SinhVien(String ten, String maSinhVien, double diemTrungBinh) {
this.ten = ten;
this.maSinhVien = maSinhVien;
this.diemTrungBinh = diemTrungBinh;
}
// Phương thức để in thông tin sinh viên
public void inThongTin() {
System.out.println("Tên: " + this.ten);
System.out.println("Mã SV: " + this.maSinhVien);
System.out.println("Điểm TB: " + this.diemTrungBinh);
System.out.println("Trường: " + SinhVien.tenTruong); // Truy cập static field
System.out.println("-------------------");
}
public static void main(String[] args) {
// Tạo các đối tượng SinhVien
SinhVien sv1 = new SinhVien("Nguyễn Văn A", "SV001", 8.5);
SinhVien sv2 = new SinhVien("Trần Thị B", "SV002", 9.0);
// In thông tin của từng sinh viên
sv1.inThongTin();
sv2.inThongTin();
// Thay đổi tên trường (static field)
SinhVien.tenTruong = "Học viện Creyt";
// In lại thông tin để thấy sự thay đổi của static field
System.out.println("Sau khi đổi tên trường:");
sv1.inThongTin();
// Thử tạo một sinh viên mới sau khi đổi tên trường
SinhVien sv3 = new SinhVien("Phạm Minh C", "SV003", 7.8);
sv3.inThongTin();
}
}
Trong ví dụ trên:
ten,maSinhVien,diemTrungBinhlà các instance fields (trường thể hiện). Mỗi đối tượngSinhViensẽ có một bản sao riêng của các trường này với các giá trị khác nhau.tenTruonglà một static field (trường tĩnh). Nó thuộc về lớpSinhVienchứ không thuộc về bất kỳ đối tượng cụ thể nào. Tất cả các đối tượngSinhVienđều chia sẻ cùng một giá trị củatenTruong. Nếu bạn thay đổi nó, sự thay đổi sẽ hiển thị cho tất cả các đối tượng.

Mẹo 'hack' để dùng Field hiệu quả (Best Practices)
-
"Private" là vàng, "Public" là nguy hiểm: Luôn luôn khai báo các Field là
private. Đây là nguyên tắc vàng của Encapsulation (đóng gói) trong OOP. Việc này giống như việc bạn bảo mật thông tin cá nhân của mình vậy, không để ai cũng có thể tùy tiện đọc hay sửa. Thay vào đó, hãy cung cấp các phương thứcpublicđể truy cập (getter) và sửa đổi (setter) các Field một cách có kiểm soát. Ví dụ:getTen(),setTen(String newTen). -
Đặt tên Field có tâm: Tên Field phải rõ ràng, dễ hiểu, phản ánh đúng ý nghĩa của dữ liệu mà nó lưu trữ. Tránh các tên chung chung như
a,b,value. Ví dụ:tenSinhVienthay vìname,soLuongSanPhamthay vìamount. -
Khởi tạo ngay và luôn: Hãy khởi tạo Field ngay khi khai báo hoặc trong constructor. Điều này giúp tránh các lỗi
NullPointerExceptionvà đảm bảo đối tượng của bạn luôn ở trạng thái hợp lệ ngay từ khi được tạo ra.
Góc nhìn học thuật sâu (Harvard Style - easy mode)
Từ góc độ của khoa học máy tính và thiết kế hệ thống, Field không chỉ là nơi chứa dữ liệu. Chúng là yếu tố cốt lõi định hình trạng thái nội tại (internal state) của một đối tượng. Trong mô hình OOP, một đối tượng được định nghĩa bởi cả dữ liệu (fields) mà nó nắm giữ và hành vi (methods) mà nó thực hiện dựa trên dữ liệu đó. Fields cung cấp tính liên tục (persistence) cho dữ liệu của đối tượng trong suốt vòng đời của nó.
Khái niệm private cho Field và truy cập thông qua public methods (getters/setters) là hiện thân của nguyên tắc Information Hiding (che giấu thông tin) và Encapsulation (đóng gói). Điều này không chỉ giúp bảo vệ tính toàn vẹn của dữ liệu mà còn giảm sự phụ thuộc giữa các phần khác nhau của hệ thống. Một thay đổi nhỏ trong cách lưu trữ dữ liệu nội bộ của một lớp sẽ không ảnh hưởng đến các lớp khác đang sử dụng nó, miễn là giao diện (các method public) vẫn giữ nguyên. Đây là yếu tố then chốt để xây dựng các hệ thống lớn, phức tạp và dễ bảo trì.
Ứng dụng thực tế: Field ở khắp mọi nơi!
Bạn dùng TikTok, Instagram, Shopee, hay chơi game online? Fields đang hoạt động miệt mài sau hậu trường đấy:
- Mạng xã hội (TikTok, Instagram): Mỗi tài khoản người dùng là một đối tượng
Uservới các Field nhưusername,email,passwordHash,avatarUrl,followerCount,followingCount,postList(danh sách các bài đăng). - Thương mại điện tử (Shopee, Lazada): Mỗi sản phẩm là một đối tượng
Productvới các Field nhưid,name,price,description,imageUrl,stockQuantity,category. - Game online (Liên Quân Mobile, Genshin Impact): Mỗi nhân vật là một đối tượng
Charactervới các Field nhưhealth,mana,attackPower,defense,positionX,positionY,inventory.
Nên dùng Field cho case nào? (Thử nghiệm và Hướng dẫn)
Anh Creyt đã từng thử nghiệm nhiều cách để quản lý dữ liệu, và kết luận là:
-
Dùng Instance Field khi: Dữ liệu đó là độc nhất cho mỗi đối tượng. Ví dụ, mỗi sinh viên có một tên, một mã riêng. Mỗi sản phẩm có một giá riêng. Đây là trường hợp phổ biến nhất.
-
Dùng Static Field khi: Dữ liệu đó là chung cho tất cả các đối tượng của một lớp. Ví dụ, tên trường đại học, số lượng sinh viên tối đa có thể đăng ký vào một môn học (nếu nó là giới hạn chung), hoặc một hằng số (constant) nào đó. Thay đổi static field sẽ ảnh hưởng đến tất cả các instance.
-
Không dùng Field khi: Dữ liệu đó chỉ là tạm thời, chỉ dùng trong phạm vi một phương thức và không cần lưu trữ sau khi phương thức kết thúc. Trong trường hợp này, hãy dùng local variable (biến cục bộ). Ví dụ, một biến
tongđể tính tổng trong một vòng lặp, sau khi tính xong thì không cần giữ lại nữa.
Nhớ nhé các bạn, Field là viên gạch đầu tiên và quan trọng nhất để xây dựng nên một thế giới OOP đầy đủ và có tổ chức. Nắm vững nó, bạn đã có trong tay chìa khóa để tạo ra những 'nhân vật' số của riêng mình rồi đó! Chúc các bạn 'code' vui vẻ!
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é!