Giới Thiệu về Lập Trình Hướng Đối Tượng (OOP)
Bài viết này nhằm mục đích giải thích rõ ràng các khái niệm cơ bản về lập trình hướng đối tượng (OOP) và giúp người đọc có cái nhìn tổng quát về nó. Bên cạnh đó, nội dung sẽ được tổng hợp từ nhiều nguồn đáng tin cậy và sẽ có thêm một số thuật ngữ tiếng Anh để đảm bảo tính chính xác và thống nhất trong chuyên môn.
Lưu ý: Bài viết có thể có một số thuật ngữ bằng tiếng Anh để giữ nguyên ý nghĩa chuyên ngành.
1. Giới Thiệu
- Java vs Python: Khác với Python, Java cần được biên dịch trước khi chạy.
- Ý thức về kiểu: Việc nắm vững các kiểu dữ liệu là rất quan trọng khi lập trình với Java.
- Mô hình đối tượng: Java tập trung vào mô hình lập trình hướng đối tượng, nơi mọi thứ đều nằm trong các lớp (classes).
- Mô hình bộ nhớ của Java: Bao gồm Stack cho các thực thi hàm, Heap cho việc lưu trữ đối tượng và thu gom rác, Non-heap (Metaspace) cho các trường tĩnh.
2. OOP Là Gì?
Lập Trình Hướng Đối Tượng (OOP) là một mô hình lập trình, tập trung vào việc sử dụng các đối tượng để đại diện và thao tác với dữ liệu. Trong OOP, dữ liệu được đóng gói trong các đối tượng, mà các đối tượng này được xác định bởi các thuộc tính (attributes) và phương thức (methods).
3. Sự Trừu Tượng và Sự Đóng Gói
3.1 Sự Trừu Tượng
- Trừu tượng hóa dữ liệu: Biến đổi dữ liệu nguyên thủy thành POJO (Plain Old Java Object).
Ví dụ:
boolean contains(double pointX, double pointY, double centreX, double centreY, double radius) {
double dx = pointX - centreX;
double dy = pointY - centreY;
double distance = Math.sqrt(dx*dx + dy*dy);
return distance < radius;
}
Cấu trúc lớp:
class Point {
double x;
double y;
}
class Circle {
Point centre;
double radius;
}
- Trừu tượng chức năng: Chia dữ liệu thành các hàm nhỏ hơn.
boolean contains(Point p, Circle c) {
double d = distance(p, c.centre);
return d < c.radius;
}
double distance(Point a, Point b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return Math.sqrt(dx*dx + dy*dy);
}
3.2 Sự Đóng Gói
4. Thừa Kế và Đa Hình
4.1 Thừa Kế
class Paper {
private int height;
private int width;
private String color;
Paper(int height, int width, String color) {
this.height = height;
this.width = width;
this.color = color;
}
Paper() {
this.height = 297;
this.width = 210;
this.color = "white";
}
}
class PrinterPaper extends Paper {
PrinterPaper() {
super(297, 210, "white");
}
}
4.2 Đa Hình
Đa hình trong OOP cho phép một đối tượng có thể có nhiều hình dạng và hành vi khác nhau. Đa hình được chia thành hai loại:
- Đa hình tĩnh (Static Polymorphism): Định nghĩa lại các phương thức cùng tên với số lượng hoặc kiểu tham số khác nhau (Method Overloading).
- Đa hình động (Dynamic Polymorphism): Định nghĩa lại các phương thức cùng tên, cùng tham số và kiểu trả về từ lớp cha (Method Overriding).
Sự khác biệt lớn nhất giữa hai loại này là: Đa hình tĩnh được xử lý tại thời điểm biên dịch, trong khi đa hình động được xử lý tại thời điểm chạy chương trình.