Lớp (Class)

"Trong Java, class (lớp) là một khái niệm cơ bản và quan trọng trong lập trình hướng đối tượng. Dưới đây là những điểm cơ bản về lớp trong Java."

Ⅰ. Lớp (Class) trong Java là gì?

Là một bản thiết kế hoặc mô tả chi tiết cho một nhóm các đối tượng có chung đặc điểm và hành vi.

Xác định các thuộc tính và phương thức chung cho các đối tượng thuộc lớp đó.

Giống như một khuôn mẫu để tạo ra các đối tượng cụ thể.

Ⅱ. Các thành phần chính của một lớp (Class)

Một lớp trong Java có thể chứa rất nhiều thành phần khác nhau, giúp định nghĩa đầy đủ về một đối tượng. Dưới đây là các thành phần chính mà một lớp có thể chứa:

1. Thuộc tính (Attributes):

↳ Biến/Trường (Variables/Fields): Các thuộc tính hoặc trạng thái của lớp. Chúng có thể được khai báo là private, protected, hoặc public. Các biến thành viên thường được sử dụng để lưu trữ dữ liệu mà đối tượng của lớp quản lý.

↳ Hằng: Các giá trị không đổi trong suốt quá trình thực thi chương trình.

2. Phương thức (Methods):

↳ Hành động: Định nghĩa các hành động mà đối tượng có thể thực hiện. Ví dụ: một lớp SinhVien có thể có phương thức inThongTin() để in thông tin của sinh viên ra màn hình.

3. Hàm Tạo (Constructor)

↳ Constructor: Hàm khởi tạo, được gọi tự động khi tạo một đối tượng để khởi tạo các thuộc tính của đối tượng.

↳ Destructor: Hàm hủy, được gọi tự động khi đối tượng bị thu hồi bộ nhớ (trong một số ngôn ngữ khác, Java không có destructor theo nghĩa đen nhưng có cơ chế garbage collection).

4. Khối mã (Blocks):

↳ Khối khởi tạo: Được thực hiện khi tạo đối tượng, trước khi gọi constructor.

↳ Khối tĩnh: Được thực hiện khi lớp được tải lần đầu tiên.

5. Lớp lồng nhau(Nested Classes):

↳ Lớp bên trong: Một lớp được định nghĩa bên trong một lớp khác.

↳ Lớp tĩnh: Một lớp lồng nhau có thể được tạo đối tượng độc lập mà không cần tạo đối tượng của lớp ngoài.

6. Giao diện (Interface):

↳ Khai báo các phương thức trừu tượng: Một lớp có thể implements một hoặc nhiều giao diện để thực hiện các phương thức được khai báo trong giao diện đó.

7. Enum:

↳ Một loại lớp đặc biệt: Dùng để định nghĩa một tập hợp các hằng số có tên.

Các thành phần chính của một lớp trong Java
Ảnh mô tả các thành phần chính của một lớp trong Java.

Ⅲ. Khai báo lớp (Class)

Cấu trúc cơ bản của một lớp trong Java:

Cú Pháp

modifier class className {
      // Khai báo thuộc tính, hàm khởi tạo và phương thức
}

Giải thích từng phần:

↳ modifier: Từ khóa truy cập cho lớp (ví dụ: public, private).

↳ className: Tên của lớp (phải tuân theo quy tắc đặt tên Java).

↳ fieldDeclaration: Khai báo các thuộc tính của lớp.

↳ methodDeclaration: Khai báo các phương thức của lớp.

Đây là một cách khai báo lớp đơn giản. Thân lớp (phần nằm giữa cặp ngoặc nhọn) chứa tất cả code cần thiết cho vòng đời của các đối tượng được tạo từ lớp: hàm khởi tạo để khởi tạo các đối tượng mới, khai báo các thuộc tính lưu trữ trạng thái của lớp và các đối tượng của nó, và các phương thức để thực hiện hành vi của lớp và các đối tượng của nó.

Khai báo lớp ở trên là dạng đơn giản. Nó chỉ chứa các thành phần bắt buộc của một khai báo lớp. Bạn có thể cung cấp thêm thông tin về lớp ở đầu khai báo, chẳng hạn như tên lớp cha, lớp có implements (triển khai) bất kỳ giao diện nào không, v.v. Ví dụ:

Cú Pháp

class MyClass extends MySuperClass implements YourInterface {
  // Khai báo thuộc tính, hàm khởi tạo và phương thức
}

Điều này có nghĩa là MyClass là lớp con của MySuperClass và nó implements giao diện YourInterface.

Bạn cũng có thể thêm các từ khóa thay đổi quyền truy cập như public (công khai) hoặc private (riêng tư) ngay ở đầu - vì vậy bạn có thể thấy rằng dòng đầu tiên của khai báo lớp có thể trở nên khá phức tạp. Các từ khóa public và private quy định lớp khác có thể truy cập MyClass như thế nào, chúng sẽ được thảo luận chi tiết hơn trong bài học sau. Bài học về giao diện và kế thừa sẽ giải thích cách và lý do tại sao bạn sử dụng các từ khóa extends (mở rộng) và implements (triển khai) trong khai báo lớp. Hiện tại, bạn không cần lo lắng về những điều phức tạp thêm này

Nhìn chung, khai báo lớp có thể bao gồm các thành phần này, theo thứ tự:

↳ Từ khóa thay đổi quyền truy cập: public (công khai), private (riêng tư) và một số từ khóa khác mà bạn sẽ gặp sau. (Tuy nhiên, lưu ý rằng từ khóa private chỉ có thể áp dụng cho các lớp lồng (nested class).).

↳ Tên lớp: được bắt đầu bằng chữ in hoa theo quy ước.

↳ TÊN LỚP CHA (nếu có): Tên lớp cha (superclass) của lớp, nếu có, được đặt trước bởi từ khóa extends. Một lớp chỉ có thể kế thừa (subclass) từ một lớp cha duy nhất.

↳ Danh sách các giao diện (interface) được implements (triển khai): Nếu lớp implements bất kỳ giao diện nào, danh sách các giao diện được phân cách bằng dấu phẩy, đứng trước bởi từ khóa implements. Một lớp có thể implements nhiều hơn một giao diện..

↳ Thân lớp: được bao bọc bởi cặp ngoặc nhọn .

Ⅳ. Khởi tạo đối tượng từ lớp (Class)

Để tạo một đối tượng trong Java, bạn cần thực hiện ba bước chính:

1. Khai báo (Declaration):

Mục đích: Cho chương trình biết kiểu đối tượng bạn muốn tạo và tên biến bạn sẽ sử dụng để tham chiếu đến nó.

Cách thực hiện: Sử dụng cú pháp sau:

Cú Pháp

Point originOne;

Trong ví dụ này, originOne là một biến được khai báo để tham chiếu đến một đối tượng của lớp Point.

2. Khởi tạo (Instantiation)

Mục đích: Tạo ra một đối tượng mới từ một lớp (bản thiết kế).

Cách thực hiện: Sử dụng toán tử new cùng với tên lớp và giá trị khởi tạo cho các thuộc tính của đối tượng.

Cú Pháp

originOne = new Point(23, 94);

Toán tử new sẽ phân bổ bộ nhớ cho một đối tượng mới của lớp Point và trả về tham chiếu đến đối tượng đó.

3. Khởi tạo giá trị ban đầu (Initialization)

Đây là bước bạn gọi một constructor để thiết lập giá trị ban đầu cho đối tượng.

Cú Pháp

Point originOne = new Point(23, 94);

Constructor Point(int a, int b) nhận vào hai tham số a và b để thiết lập giá trị cho x và y. Khi bạn gọi new Point(23, 94), nó sẽ gán x = 23 và y = 94.

4. Ví dụ cụ thể

Hãy chắc chắn rằng các tệp trên được lưu với các tên Point.java, Rectangle.java, và CreateObjectDemo.java, và tất cả chúng đều nằm trong cùng một thư mục.

Lớp Point đại diện cho một điểm trong không gian hai chiều, có các thuộc tính x và y để lưu trữ tọa độ của điểm đó trên trục hoành và trục tung.

Ví dụ: Point.java

// Định nghĩa lớp Point với hai thuộc tính x và y
public class Point {
    public int x = 0;
    public int y = 0;

    // Constructor của lớp Point, nhận vào hai tham số int và gán giá trị cho x và y
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

Đặc điểm:

↳ x và y: Là các biến thành viên (instance variables) của lớp Point để lưu trữ tọa độ của điểm.

↳ Constructor: Lớp có một constructor để khởi tạo giá trị cho x và y khi một đối tượng Point được tạo ra.

Lớp Rectangle đại diện cho một hình chữ nhật trong không gian hai chiều, được xác định bởi chiều rộng (width), chiều cao (height) và một điểm gốc (origin) là tọa độ của góc trái trên của hình chữ nhật.

Ví dụ: Rectangle .java

public class Rectangle {
    public int width = 0;
    public int height = 0;
    public Point origin;

    // Constructor không tham số
    public Rectangle() {
        origin = new Point(0, 0);
    }

    // Constructor với một tham số Point
    public Rectangle(Point p) {
        origin = p;
    }

    // Constructor với hai tham số int
    public Rectangle(int w, int h) {
        origin = new Point(0, 0);
        width = w;
        height = h;
    }

    // Constructor với một tham số Point và hai tham số int
    public Rectangle(Point p, int w, int h) {
        origin = p;
        width = w;
        height = h;
    }
    // phương thức di chuyển hình chữ nhật
    public void move(int x, int y) {
         origin.x = x;
        origin.y = y;
    }

    // phương thức tính diện tích hình chữ nhật
    public int getArea() {
     return width * height;
    }
}

Đặc điểm:

↳ width và height: Là các biến thành viên để lưu trữ kích thước của hình chữ nhật.

↳ origin: Là một đối tượng của lớp Point, biểu diễn tọa độ của góc trái trên của hình chữ nhật.

↳ Constructor: Lớp có nhiều hàm khởi tạo (constructor) để tạo ra đối tượng Rectangle với các cách khác nhau, bao gồm không có tham số, một Point, hai số nguyên, và một Point kèm theo hai số nguyên.

Trong lớp CreateObjectDemo, phương thức main được sử dụng để tạo và khởi tạo các đối tượng Point và Rectangle, và sau đó in ra thông tin của chúng.

Ví dụ: Rectangle .java

public class CreateObjectDemo {
    public static void main(String[] args) {
        // Khai báo và khởi tạo đối tượng Point với giá trị x = 2 và y = 4
        Point Toado = new Point(2, 4);

        // Khai báo và khởi tạo đối tượng Rectangle với đối tượng Point Toado và các giá trị width = 20, height = 40
        Rectangle HinhMot = new Rectangle(Toado, 20, 40);

        // Khai báo và khởi tạo đối tượng Rectangle với width = 50 và height = 100, origin mặc định là (0, 0)
        Rectangle HinhHai = new Rectangle(50, 100);

        // In thông tin của các đối tượng để kiểm tra
        System.out.println("Hình thứ nhất: Tọa độ (" + HinhMot.origin.x + ", " + HinhMot.origin.y + "), Rộng: " + HinhMot.width + ", Dài: " + HinhMot.height);
        System.out.println("Hình thứ hai: Tọa độ (" + HinhHai.origin.x + ", " + HinhHai.origin.y + "), Rộng: " + HinhHai.width + ", Dài: " + HinhHai.height);

        // In diện tích của hai hình chữ nhật
        System.out.println("Diện tích hình 1: " + HinhMot.getArea());
        System.out.println("Diện tích hình 2: " + HinhHai.getArea());

        // Thay đổi tọa độ hình chữ nhật thứ nhất và in lại thông tin
        HinhMot.move(4, 2);
        System.out.println("Hình thứ nhất sau khi di chuyển: Tọa độ (" + HinhMot.origin.x + ", " + HinhMot.origin.y + "), Rộng: " + HinhMot.width + ", Dài: " + HinhMot.height);
    }
}

Đặc điểm:

↳ Lớp CreateObjectDemo chứa phương thức main, là nơi chính để thực thi chương trình.

↳ Sử dụng: Trong phương thức main, bạn đã tạo:

↳ Một đối tượng Point tại tọa độ (2, 4).

↳ Hai đối tượng Rectangle: HinhMot với góc trái trên ở Toado và kích thước 20x40, HinhHai với kích thước 50x100 và góc trái trên mặc định ở (0, 0).

↳ In ra thông tin của hai hình chữ nhật và diện tích của chúng.

↳ Thay đổi tọa độ của HinhMot và in lại thông tin để xem sự thay đổi.

Kết quả của chương trình là:

Hình thứ nhất: Tọa độ (2, 4), Rộng: 20, Dài: 40
Hình thứ hai: Tọa độ (0, 0), Rộng: 50, Dài: 100
Diện tích hình 1: 800
Diện tích hình 1: 5000
Hình thứ nhất: Tọa độ (4, 2), Rộng: 20, Dài: 40

Ⅴ. Sử dụng các thành viên lớp (thuộc tính, phương thức)

Truy cập và sửa đổi thuộc tính

Sử dụng toán tử . sau tên đối tượng và tên thuộc tính.

Gọi phương thức

Sử dụng toán tử . sau tên đối tượng và tên phương thức, theo sau là dấu ngoặc đơn và danh sách tham số (nếu có).

Ví dụ: Thuộc tính và phương thức của một chiếc ô tô

↳ Thuộc tính (Attributes)

Các thuộc tính là những đặc điểm hoặc đặc tính của một chiếc ô tô. Dưới đây là một số thuộc tính phổ biến: Màu sắc (color), Trọng lượng (weight), Hãng sản xuất (manufacturer), Mẫu xe (model), Năm sản xuất (year), Loại nhiên liệu (fuelType), Tốc độ tối đa (maxSpeed), Giá tiền (price)

↳ Phương thức (Methods)

Các phương thức là những hành động mà một chiếc ô tô có thể thực hiện hoặc những thao tác có thể được thực hiện trên một chiếc ô tô. Dưới đây là một số phương thức phổ biến: Khởi động (start), Dừng (stop), Lái xe (drive), Bật đèn (turnOnLights), Tắt đèn (turnOffLights), Tăng tốc (accelerate), Giảm tốc (decelerate),

Ví dụ: Rectangle .java

public class Car {
    // Thuộc tính của lớp Car
    String color;
    double weight;
    String manufacturer;
    String model;
    int year;
    String fuelType;
    int maxSpeed;
    int mileage;
    double price;

    // Phương thức của lớp Car
    void start() {
        System.out.println("Xe đang khởi động");
    }

    void stop() {
        System.out.println("Xe đang dừng lại");
    }

    void drive() {
        System.out.println("Xe đang được lái");
    }

    void brake() {
        System.out.println("Xe đang phanh gấp");
    }

    void turnOnLights() {
        System.out.println("Đèn đang được bật");
    }

    void turnOffLights() {
        System.out.println("Đèn đang được tắt");
    }

    void accelerate() {
        System.out.println("Xe đang tăng tốc");
    }

    void decelerate() {
        System.out.println("Xe đang giảm tốc");
    }
    @Override
    public String toString() {
        return "Car: " +
                " Màu= " + color  +
                ", Trọng lượng= " + weight +
                ", Hãng= " + manufacturer + 
                "";
    }
    public class Main {
        public static void main(String[] args) {
            // Khởi tạo đối tượng Car
            Car myCar = new Car();
            
            // Gán giá trị cho các thuộc tính của đối tượng Car
            myCar.color = "Red";
            myCar.weight = 1500.5;
            myCar.manufacturer = "Toyota";
            System.out.println(myCar);
            
            // Sử dụng các phương thức của đối tượng Car
            myCar.start();
        }
    }
}

Kết quả của chương trình là:

Car: Màu= Red, Trọng lượng= 1500.5, Hãng= Toyota
Xe đang khởi động

Trong ví dụ trên, Lớp Car được định nghĩa với các thuộc tính và phương thức trên, và sau đó một đối tượng Car được khởi tạo và sử dụng trong hàm main.

Ⅵ. So sánh lớp (Class) và đối tượng (Object) trong lập trình hướng đối tượng

Đối tượng và lớp là hai khái niệm cơ bản và quan trọng trong lập trình hướng đối tượng (OOP). Việc hiểu rõ sự khác biệt giữa hai khái niệm này là rất cần thiết để viết code OOP hiệu quả.

Tiêu chíLớp (Class)Đối tượng (Object)
Bản chấtBản thiết kế hoặc khuôn mẫuThực thể cụ thể, instance của lớp
Khái niệmTrừu tượng, định nghĩa các thuộc tính và hành viCụ thể, có trạng thái và hành vi
Tạo ra bằngĐịnh nghĩa với từ khóa classTạo ra từ lớp bằng từ khóa new
Ví dụclass Car { ... }Car myCar = new Car();
Vai tròĐịnh nghĩa thuộc tính và phương thức chungThực hiện hành động cụ thể và lưu trữ trạng thái
StaticCó thể có các thành phần staticKhông thể là static, tất cả là instance-specific
Số lượngMột lớp có thể có nhiều đối tượngMột đối tượng là instance của một lớp
Sự khác biệt giữa lớp và đối tượng
Ảnh minh họa để thấy sự khác biệt giữa lớp và đối tượng.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”