[Java Backend Zero to Hello] BÀI 1.6: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) - CƠ BẢN
📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 1: Java Core Cơ Bản | Bài 8/86
BÀI 1.6: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) - CƠ BẢN
Mục tiêu
- Hiểu tư duy OOP và lợi ích
- Khai báo Class, Object, Constructor
- Sử dụng từ khóa
this - Phân biệt các loại biến trong class
1. TƯ DUY OOP
OOP (Object-Oriented Programming) mô hình hóa thế giới thực thành các đối tượng có:
- Thuộc tính (attributes/fields) - đặc điểm
- Phương thức (methods) - hành vi
Ví dụ thực tế
Class: Student
├── Thuộc tính: name, age, gpa
└── Phương thức: study(), takeExam(), displayInfo()
4 tính chất OOP
- Encapsulation (Đóng gói)
- Inheritance (Kế thừa)
- Polymorphism (Đa hình)
- Abstraction (Trừu tượng)
Bài này tập trung vào Class/Object cơ bản. 4 tính chất sẽ học ở bài 1.7.
2. CLASS VÀ OBJECT
2.1 Khai báo Class
[access modifier] class <TênClass> {
// Fields (thuộc tính)
// Constructors
// Methods
}
2.2 Ví dụ đầu tiên
public class Student {
// Fields (thuộc tính)
String name;
int age;
double gpa;
// Method
public void displayInfo() {
System.out.println("Tên: " + name);
System.out.println("Tuổi: " + age);
System.out.println("GPA: " + gpa);
}
public void study() {
System.out.println(name + " đang học bài...");
}
}
2.3 Tạo Object
public class Main {
public static void main(String[] args) {
// Tạo object bằng từ khóa 'new'
Student student1 = new Student();
student1.name = "Nguyễn Văn A";
student1.age = 20;
student1.gpa = 3.5;
student1.displayInfo();
student1.study();
// Tạo object khác
Student student2 = new Student();
student2.name = "Trần Thị B";
student2.age = 21;
student2.gpa = 3.8;
}
}
3. CONSTRUCTOR (HÀM TẠO)
Constructor là phương thức đặc biệt được gọi khi tạo object.
3.1 Đặc điểm
- Tên trùng tên class
- Không có kiểu trả về (kể cả
void) - Được gọi tự động khi
new - Có thể có nhiều constructor (overloading)
3.2 Constructor mặc định
Nếu không khai báo, Java tự tạo constructor mặc định (không tham số).
public class User {
String name;
// Java tự tạo: public User() {}
}
3.3 Constructor có tham số
public class Student {
String name;
int age;
double gpa;
// Constructor có tham số
public Student(String name, int age, double gpa) {
this.name = name;
this.age = age;
this.gpa = gpa;
}
public void displayInfo() {
System.out.println(name + " - " + age + " - " + gpa);
}
}
// Sử dụng
Student s = new Student("An", 20, 3.5);
s.displayInfo(); // An - 20 - 3.5
3.4 Constructor Overloading
public class Student {
String name;
int age;
double gpa;
public Student() {
this.name = "Chưa rõ";
this.age = 0;
this.gpa = 0.0;
}
public Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, double gpa) {
this.name = name;
this.age = age;
this.gpa = gpa;
}
}
3.5 Constructor chaining với this()
public class Student {
String name;
int age;
double gpa;
public Student() {
this("Chưa rõ", 0, 0.0); // Gọi constructor khác
}
public Student(String name) {
this(name, 0, 0.0);
}
public Student(String name, int age) {
this(name, age, 0.0);
}
public Student(String name, int age, double gpa) {
this.name = name;
this.age = age;
this.gpa = gpa;
}
}
⚠️
this()phải là câu lệnh đầu tiên trong constructor.
4. TỪ KHÓA this
this tham chiếu đến đối tượng hiện tại.
4.1 Phân biệt biến instance và tham số
public class User {
private String name;
public void setName(String name) {
this.name = name; // this.name = field, name = parameter
}
}
4.2 Gọi constructor khác
public User() {
this("Default"); // Gọi User(String)
}
public User(String name) {
this.name = name;
}
4.3 Trả về chính object hiện tại
public class Builder {
private String value;
public Builder setValue(String value) {
this.value = value;
return this; // Cho phép chain method
}
}
// Sử dụng
new Builder().setValue("A").setValue("B");
5. CÁC LOẠI BIẾN TRONG CLASS
public class Example {
// 1. Biến static (class variable) - chia sẻ cho mọi object
public static int count = 0;
// 2. Biến instance - mỗi object có bản riêng
private String name;
public void method() {
// 3. Biến local - chỉ tồn tại trong method
int localVar = 10;
// 4. Biến parameter - tham số
// (không có ở đây)
}
}
So sánh
| Loại | Vị trí | Số lượng | Truy cập |
|---|---|---|---|
| Static | Class | 1 cho cả class | ClassName.var |
| Instance | Object | 1 cho mỗi object | object.var |
| Local | Method/Block | Tùy số lần gọi | Trong method |
| Parameter | Method signature | Tùy số lần gọi | Trong method |
6. ENCAPSULATION CƠ BẢN (ĐÓNG GÓI)
Ẩn chi tiết bên trong, chỉ expose những gì cần thiết.
6.1 Access Modifier
public class BankAccount {
private double balance; // private - chỉ truy cập trong class
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public double getBalance() {
return balance;
}
}
6.2 Getter và Setter
public class User {
private String name;
private int age;
// Getter
public String getName() {
return name;
}
// Setter với validation
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
}
}
}
6.3 Lợi ích
- Bảo vệ dữ liệu khỏi truy cập trái phép
- Validation tập trung trong setter
- Linh hoạt thay đổi implementation mà không ảnh hưởng bên ngoài
7. TỪ KHÓA final VỚI FIELD
public class Constants {
// Phải khởi tạo trong constructor hoặc khi khai báo
public final String NAME;
public final int MAX = 100;
public Constants(String name) {
this.NAME = name; // OK - gán 1 lần trong constructor
}
}
8. STATIC KEYWORD
8.1 Static field
public class Employee {
private String name;
public static int count = 0; // Đếm số employee
public Employee(String name) {
this.name = name;
count++; // Tăng mỗi khi tạo object
}
}
new Employee("A");
new Employee("B");
System.out.println(Employee.count); // 2
8.2 Static method
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
// Gọi không cần tạo object
MathUtil.add(5, 3);
8.3 Static block
public class Config {
public static final String DB_URL;
static {
DB_URL = "jdbc:mysql://localhost:3306/mydb";
System.out.println("Config loaded");
}
}
9. BÀI TẬP THỰC HÀNH
Bài 1: Class Rectangle
public class Rectangle {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double area() {
return width * height;
}
public double perimeter() {
return 2 * (width + height);
}
public boolean isSquare() {
return width == height;
}
}
Bài 2: Class Circle với static PI
Bài 3: Class BankAccount
- Fields: accountNumber, balance
- Methods: deposit(), withdraw(), getBalance()
- Validation: không cho rút quá số dư
Bài 4: Class Employee
- Fields: id, name, salary
- Static field: count (đếm số nhân viên)
- Methods: tăng lương, hiển thị thông tin
Bài 5: Class Product
- Fields: id, name, price, quantity
- Constructor mặc định và có tham số
- Method: tính tổng giá trị kho
10. TÓM TẮT
| Khái niệm | Điểm chính |
|---|---|
| Class | Khuôn mẫu cho object |
| Object | Thể hiện cụ thể của class |
| Constructor | Khởi tạo object, tên trùng class |
this |
Tham chiếu object hiện tại |
| Encapsulation | Ẩn chi tiết, dùng getter/setter |
| Static | Thuộc class, chia sẻ chung |
final |
Không thể thay đổi |
Bài tiếp theo: 1.7 4 tính chất OOP
🧭 Điều Hướng Series
⬅️ Bài trước: BÀI 1.5: PHƯƠNG THỨC & TÁI SỬ DỤNG CODE
📋 Lộ trình tổng quan: Xem Toàn Bộ Series
➡️ Bài tiếp theo: BÀI 1.7: 4 TÍNH CHẤT CỦA OOP
All rights reserved