1. Lớp và đối tượng là gì
Hãy bắt đầu với một phép so sánh. Hãy tưởng tượng một bản thiết kế của ô tô. Trên bản thiết kế ghi rõ chiếc xe có bốn bánh, động cơ, màu sắc, ghế ngồi, v.v. Nhưng bản thiết kế tự nó không chạy trên đường, không nổ máy và không cần xăng. Nó chỉ là mô tả cách chiếc xe được cấu tạo.
Lớp trong lập trình — là “bản thiết kế” (hoặc khuôn mẫu) xác định dữ liệu nào (các trường) và hành động nào (các phương thức) mà các thể hiện của nó sẽ có.
Đối tượng — là “chiếc xe thực” được lắp ráp theo bản thiết kế đó, tức một thể hiện cụ thể. Mỗi đối tượng có trạng thái riêng (ví dụ, có chiếc màu đỏ, chiếc khác — màu xanh), và hành vi: mỗi đối tượng có thể thực hiện các hành động được định nghĩa trong lớp (ví dụ: chạy, phanh, bấm còi).
Ví dụ đời thực
- Lớp: Con người (Person) — mô tả rằng một người có tên, tuổi, chiều cao và có thể nói hoặc chạy.
- Các đối tượng: Vasya, Petya, Katya — những người cụ thể, mỗi người có tên và tuổi riêng.
| Lớp | Đối tượng 1 | Đối tượng 2 |
|---|---|---|
|
|
|
Vì sao các lớp quan trọng?
- Nhóm các biến và phương thức liên quan lại với nhau.
- Tạo bao nhiêu đối tượng tùy ý với cùng cấu trúc nhưng dữ liệu khác nhau.
- Dễ dàng mô tả các thực thể phức tạp: ví dụ, “Tài khoản ngân hàng”, “Sản phẩm”, “Sách”, “Người dùng”.
2. Cú pháp khai báo lớp
Trong Java, lớp được khai báo bằng từ khóa class. Theo sau là tên lớp (theo thông lệ — viết hoa chữ cái đầu), rồi đến dấu ngoặc nhọn, bên trong là các trường và phương thức.
Ví dụ đơn giản nhất
public class Person {
// Ở đây sẽ có các trường và phương thức
}
Giải thích:
- public — bộ sửa đổi truy cập.
- class — nói với trình biên dịch: “tôi khai báo một lớp”.
- Person — tên lớp (bạn tự đặt, nhưng viết hoa chữ cái đầu).
Quy tắc quan trọng khi đặt tên lớp
- Tên lớp phải bắt đầu bằng chữ in hoa (ví dụ: Car, Account, Book).
- Trong tên lớp không được có khoảng trắng và ký tự đặc biệt, ngoại trừ dấu gạch dưới và $ (nhưng rất hiếm khi dùng).
- Nếu tên gồm nhiều từ, hãy dùng kiểu CamelCase: BankAccount, BookStore.
Viết lớp ở đâu?
Bạn có thể khai báo lớp trong một tệp riêng (thường làm vậy: một tệp — một lớp) hoặc bên trong một lớp khác (chúng ta sẽ nói về lớp lồng nhau sau).
Ví dụ, tệp Person.java:
public class Person {
// trường và phương thức
}
3. Trường và phương thức của lớp (tóm tắt)
Cho đến giờ chúng ta mới chỉ khai báo lớp, nhưng nó đang trống — như một chiếc hộp không có gì bên trong. Hãy thêm vào đó “thuộc tính” (trường) và “hành động” (phương thức).
Trường (biến bên trong lớp)
Trường mô tả dữ liệu mà mỗi đối tượng của lớp đó sẽ có.
public class Person {
String name; // tên
int age; // tuổi
}
Phương thức (hàm bên trong lớp)
Các phương thức mô tả đối tượng có thể làm gì.
public class Person {
String name;
int age;
void sayHello() {
System.out.println("Xin chào, tôi tên là " + name + "!");
}
}
Giải thích:
- void — phương thức không trả về gì (chúng ta sẽ nói về giá trị trả về sau).
- sayHello() — tên phương thức, bắt buộc có dấu ngoặc tròn.
- Bên trong phương thức có thể truy cập các trường của lớp (ví dụ, name).
4. Tạo đối tượng
Và bây giờ — thật kỳ diệu! Làm sao từ bản thiết kế tạo ra “chiếc xe thực”? Dùng từ khóa new.
Cú pháp tạo đối tượng
Person vasya = new Person();
- Person — kiểu của biến (lớp của chúng ta).
- vasya — tên biến (bạn có thể đặt tùy ý).
- new Person() — tạo một đối tượng mới kiểu Person.
Bây giờ chúng ta có biến vasya tham chiếu tới một đối tượng của lớp Person. Đối tượng này có các trường và phương thức riêng.
Truy cập trường và phương thức
Truy cập tới trường và phương thức qua dấu chấm:
vasya.name = "Vasya";
vasya.age = 25;
vasya.sayHello(); // Sẽ in: Xin chào, tôi tên là Vasya!
Có thể tạo bao nhiêu đối tượng tùy ý
Person petya = new Person();
petya.name = "Petya";
petya.age = 30;
petya.sayHello(); // Xin chào, tôi tên là Petya!
Mỗi đối tượng — một “bản sao” độc lập với dữ liệu riêng.
5. Liên hệ với các chủ đề trước
Trước bài giảng hôm nay, tất cả biến và phương thức chúng ta đều khai báo ngay trong lớp có phương thức main và chưa nghĩ tới việc tạo các kiểu riêng. Giờ đây, chúng ta có thể tạo các “container” dữ liệu và hàm của riêng mình.
Điều này mở ra rất nhiều khả năng! Bây giờ bạn có thể mô tả bất kỳ thực thể nào trong bài toán của mình: khách hàng, sản phẩm, tài khoản, đơn hàng, động vật, ô tô — bất cứ thứ gì. Chương trình trở nên có cấu trúc hơn, dễ đọc hơn và dễ mở rộng hơn.
Ví dụ: lớp tự định nghĩa đầu tiên của chúng ta
Hãy viết một lớp đơn giản cho chương trình mini — ví dụ, “Tài khoản ngân hàng” (BankAccount). Chúng ta sẽ phát triển ví dụ này trong suốt khóa học.
public class BankAccount {
String owner; // chủ sở hữu tài khoản
int balance; // số dư tài khoản
void printInfo() {
System.out.println("Chủ sở hữu: " + owner + ", số dư: " + balance + " euro.");
}
}
Giờ trong phương thức chính main (vẫn cần để chạy chương trình) chúng ta có thể tạo các đối tượng của lớp này:
public class Main {
public static void main(String[] args) {
BankAccount account1 = new BankAccount();
account1.owner = "Ivan";
account1.balance = 1000;
account1.printInfo(); // Chủ sở hữu: Ivan, số dư: 1000 euro.
BankAccount account2 = new BankAccount();
account2.owner = "Maria";
account2.balance = 2000;
account2.printInfo(); // Chủ sở hữu: Maria, số dư: 2000 euro.
}
}
Lưu ý: mỗi đối tượng có giá trị trường riêng. Nếu bạn thay đổi số dư của account1, điều đó sẽ không ảnh hưởng gì tới account2.
Sơ đồ trực quan: lớp và đối tượng
graph TD
subgraph Class
Person["Class Person | name:String | age:int | sayHello()"]
end
subgraph Objects
vasya["vasya : Person | name = 'Vasya' | age = 20"]
petya["petya : Person | name = 'Petya' | age = 25"]
end
vasya --> Person
petya --> Person
Giải thích:
- Person — là lớp (khuôn mẫu).
- vasya và petya — các đối tượng (thể hiện) được tạo theo khuôn mẫu đó.
6. Những lỗi thường gặp khi khai báo lớp và tạo đối tượng
Lỗi số 1: Tên lớp viết bằng chữ thường.
Trong Java có thông lệ (trình biên dịch không báo lỗi, nhưng các lập trình viên giàu kinh nghiệm — có!) đặt tên lớp bằng chữ in hoa ở đầu. Đừng viết class person — hãy viết class Person.
Lỗi số 2: Thiếu dấu ngoặc nhọn.
Đừng quên rằng phần thân lớp luôn phải đặt trong dấu ngoặc nhọn.
public class Person // lỗi!
String name;
Đúng:
public class Person {
String name;
}
Lỗi số 3: Cố gắng truy cập trường và phương thức của lớp mà không tạo đối tượng.
Nếu phương thức hoặc trường không được khai báo là static, bạn chỉ có thể truy cập chúng thông qua đối tượng:
Person.sayHello(); // lỗi!
Đúng:
Person vasya = new Person();
vasya.sayHello();
Lỗi số 4: Tên tệp không khớp tên lớp (đối với lớp public).
Nếu lớp được khai báo là public, tên tệp phải trùng với tên lớp:
// Tệp Person.java
public class Person { ... }
Nếu tệp có tên khác, trình biên dịch sẽ báo lỗi.
Lỗi số 5: Sử dụng các trường của lớp mà không khởi tạo đối tượng.
Các trường của lớp (không static) thuộc về đối tượng, không thuộc về chính lớp.
GO TO FULL VERSION