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.

Ⅲ. 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ứ 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à:
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ất | Bản thiết kế hoặc khuôn mẫu | Thực thể cụ thể, instance của lớp |
Khái niệm | Trừu tượng, định nghĩa các thuộc tính và hành vi | Cụ thể, có trạng thái và hành vi |
Tạo ra bằng | Định nghĩa với từ khóa class | Tạ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 chung | Thực hiện hành động cụ thể và lưu trữ trạng thái |
Static | Có thể có các thành phần static | Không thể là static, tất cả là instance-specific |
Số lượng | Một lớp có thể có nhiều đối tượng | Một đối tượng là instance của một lớp |
