4 Đặc Trưng Của OOP Trong Java

4 Đặc Tính Cơ Bản Của Lập Trình Hướng Đối Tượng (OOP) Trong Java
Lập trình hướng đối tượng (Object-Oriented Programming – OOP) là kiến thức nền tảng mà bất kỳ lập trình viên nào cũng phải nắm vững. Khi đi phỏng vấn, đặc biệt ở vị trí Junior Backend Developer, câu hỏi về OOP gần như luôn xuất hiện. OOP không chỉ là một khái niệm lập trình, mà còn là nền tảng cho hầu hết các design pattern hiện nay. Bài viết này là phần tổng hợp từ kinh nghiệm học tập và thực hành của mình về OOP trong Java, kèm ví dụ dễ hiểu.
1.Tính đóng gói (Encapsulation)
Đóng gói là cách giấu đi những chi tiết xử lý bên trong của một đối tượng, chỉ cho phép bên ngoài tác động thông qua các phương thức công khai (public method). Điều này giúp bảo vệ dữ liệu, tránh việc thay đổi trạng thái của đối tượng một cách không kiểm soát.
Cách thực hiện trong Java:
- Khai báo các thuộc tính (fields) là private.
- Cung cấp getter và setter để truy cập hoặc thay đổi dữ liệu.
Ví dụ:
`class Person {
private String name; // không thể truy cập trực tiếp
public String getName() {
return name;
}
public void setName(String name) {
if(name != null && !name.isEmpty()) {
this.name = name;
}
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.setName("John"); // đặt giá trị qua setter
System.out.println(p.getName()); // lấy giá trị qua getter
}
}`
💡 Lợi ích: Bảo mật dữ liệu, kiểm soát được quá trình thay đổi giá trị, và dễ dàng bảo trì code.
2.Tính kế thừa (Inheritance)
Kế thừa cho phép một lớp (class con) sử dụng lại thuộc tính và phương thức của một lớp khác (class cha), giúp tái sử dụng code và mở rộng chức năng mà không cần viết lại từ đầu.
Các kiểu kế thừa trong Java:
- Single-level Inheritance: Kế thừa từ một lớp cha.
- Multi-level Inheritance: Lớp con kế thừa từ lớp cha, và lớp đó lại kế thừa từ lớp cha khác.
(Java không hỗ trợ kế thừa đa lớp trực tiếp – multiple inheritance – cho class, nhưng có thể dùng interface để đạt hiệu quả tương tự.)
Ví dụ:
class Animal {
public void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.eat(); // phương thức từ Animal
d.bark(); // phương thức từ Dog
}
}
💡 Lợi ích: Giảm lặp code, dễ bảo trì, giúp tổ chức hệ thống theo cấu trúc phân cấp.
Tính đa hình (Polymorphism)
Đa hình cho phép cùng một phương thức có thể hoạt động khác nhau tùy vào đối tượng thực tế đang gọi nó.
Các dạng đa hình trong Java:
- Compile-time Polymorphism (Method Overloading): Cùng tên phương thức nhưng khác tham số.
- Runtime Polymorphism (Method Overriding): Lớp con ghi đè phương thức của lớp cha để thay đổi cách hoạt động.
Ví dụ Overriding (đa hình runtime):
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog(); // biến kiểu cha, đối tượng thật là Dog
a.sound(); // Kết quả: "Dog barks"
}
}
💡 Lợi ích: Code linh hoạt, dễ mở rộng, cho phép xử lý nhiều loại đối tượng bằng cùng một giao diện.
Tính trừu tượng (Abstraction)
Trừu tượng hóa là quá trình chỉ mô tả những gì cần thiết, ẩn đi chi tiết triển khai bên trong. Người dùng chỉ cần biết đối tượng làm gì, không cần biết làm như thế nào.
Cách thực hiện trong Java:
- Abstract class: Lớp trừu tượng, có thể chứa cả phương thức trừu tượng (chưa triển khai) và phương thức bình thường.
- Interface: Chỉ chứa khai báo phương thức (Java 8 trở lên cho phép default method).
Ví dụ với abstract class:
abstract class Animal {
abstract void makeSound();
public void sleep() {
System.out.println("Sleeping...");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Woof woof");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.makeSound(); // "Woof woof"
a.sleep(); // "Sleeping..."
}
}
💡 Lợi ích: Giúp thiết kế hệ thống rõ ràng, tách biệt phần giao diện (interface) với phần triển khai.
Kết luận
Bốn đặc tính Encapsulation, Inheritance, Polymorphism, Abstraction là nền tảng để hiểu và áp dụng lập trình hướng đối tượng trong Java. Nắm vững chúng sẽ giúp bạn:
- Viết code rõ ràng, dễ bảo trì.
- Tái sử dụng và mở rộng chức năng dễ dàng.
- Hiểu và áp dụng các design pattern hiệu quả.