0

[Java Backend Zero to Hello] BÀI 1.6: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) - CƠ BẢN

Java Backend Zero to Hello

📚 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

  1. Encapsulation (Đóng gói)
  2. Inheritance (Kế thừa)
  3. Polymorphism (Đa hình)
  4. 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí