![[Phần 2] OOP: Tìm Hiểu "Đóng Gói" và "Trừu Tượng" trong Lập Trình Hướng Đối Tượng](https://wsrv.nl/?url=https%3A%2F%2Fcrfkoxdzoznantjpepax.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fthumbnail-posts%2Fthumbnails%2F0.30333661197052675.jpg&q=85&output=webp)
[Phần 2] OOP: Tìm Hiểu "Đóng Gói" và "Trừu Tượng" trong Lập Trình Hướng Đối Tượng
Hải Đăng
Tác giả tại CLB Lập Trình PTIT
Như đã đề cập ở bài trước, lập trình hướng đối tượng là một mô hình lập trình dựa trên khái niệm “đối tượng”, có thể chứa dữ liệu và mã. Hôm nay, chúng ta sẽ cùng nhau tìm hiểu về hai tính chất quan trọng trong lập trình hướng đối tượng: "Đóng gói" và "Trừu tượng".
Tính Đóng Gói (Encapsulation)
Tính đóng gói là một trong những tính chất cơ bản của lập trình hướng đối tượng. Nó cho phép chúng ta "đóng gói" các thuộc tính và phương thức của một đối tượng vào một đơn vị duy nhất.

🌏 Public: Các phương thức và thuộc tính có thể truy cập từ bất kỳ đối tượng nào.
🔒 Protected: Các phương thức và thuộc tính chỉ có thể truy cập từ các lớp con của lớp đó.
👤 Private: Các phương thức và thuộc tính chỉ có thể truy cập từ bên trong lớp đó.
Việc định nghĩa các mức truy cập giúp đảm bảo tính đóng gói và tránh các lỗi truy cập không đúng từ bên ngoài.
java1class Student { 2 private String name; 3 private int age; 4 private float score; 5 6 // Constructor 7 public Student(String name, int age, float score) { 8 this.name = name; 9 this.age = age; 10 this.score = score; 11 } 12 13 // Setter cho thuộc tính score 14 public void setScore(float score) { 15 this.score = score; 16 } 17 18 // Getter cho thuộc tính score 19 public float getScore() { 20 return this.score; 21 } 22} 23 24public class Main { 25 public static void main(String[] args) { 26 Student s = new Student("John", 20, 8.5f); 27 s.setScore(9.0f); 28 System.out.println(s.getScore()); 29 } 30} 31
Với ví dụ này, tính đóng gói được thể hiện trong việc khai báo các thuộc tính name
, age
, score
của lớp Student
dưới nhãn phạm vi private
.
Các thuộc tính này được ẩn đi và không thể truy cập trực tiếp bởi người dùng. Thay vào đó, người dùng phải truy cập thông qua các phương thức Getter
và Setter
. Điều này giúp bảo vệ dữ liệu và đảm bảo tính toàn vẹn của đối tượng.
Tính Trừu Tượng (Abstraction)

Nói cách khác, người dùng chỉ cần biết có thể thực hiện những gì (what), còn việc thực hiện ra sao (how) thì không cần quan tâm.
java1abstract class Shape { 2 abstract float getArea(); // Phương thức trừu tượng 3} 4 5class Circle extends Shape { 6 private float radius; 7 8 public Circle(float radius) { 9 this.radius = radius; 10 } 11 12 @Override 13 public float getArea() { 14 return 3.14f * radius * radius; 15 } 16} 17 18class Square extends Shape { 19 private float side; 20 21 public Square(float side) { 22 this.side = side; 23 } 24 25 @Override 26 public float getArea() { 27 return side * side; 28 } 29} 30 31public class Main { 32 public static void main(String[] args) { 33 Circle c = new Circle(5); 34 Square s = new Square(6); 35 36 System.out.println("Circle Area: " + c.getArea()); 37 System.out.println("Square Area: " + s.getArea()); 38 } 39}
Như trong đoạn mã này, người dùng biết và có thể sử dụng phương thức getArea()
của lớp Shape
để tính diện tích của hình tròn và vuông, mà không cần biết công thức cũng như cách hoạt động của phương thức này.
Tính trừu tượng giúp đơn giản hóa việc tương tác với các đối tượng và làm cho mã nguồn trở nên dễ hiểu và bảo trì hơn.
Kết Luận
Trên đây là phần 2 trong series "Lập trình hướng đối tượng", nơi chúng ta đã cùng nhau tìm hiểu về tính "Đóng gói" và "Trừu tượng". Hy vọng qua bài viết này, các bạn đã có cái nhìn rõ ràng hơn về hai tính chất quan trọng này.
Đừng quên theo dõi chúng tôi để cập nhật thêm nhiều kiến thức lập trình hữu ích nhé!
💻 Fanpage: https://www.facebook.com/clubproptit/
🌐 Website: https://proptit.com/
📺 Youtube: https://www.youtube.com/channel/UCdOcZv16XwUi7bhawqPjV9g
💌 Email: clblaptrinhptit@gmail.com
Lập trình hướng đối tượng
Serie tìm hiểu về Lập trình hướng đối tượng và Java