Lập trình hướng đối tượng (OOP) là một phương pháp lập trình mà chúng ta tập trung vào việc xây dựng các đối tượng và tương tác giữa chúng. Java là một ngôn ngữ lập trình hướng đối tượng mạnh mẽ với nhiều tính năng tuyệt vời để phát triển ứng dụng.
Tính đóng gói OOP trong Java
Tính đóng gói (Encapsulation) trong Java đảm bảo rằng chi tiết triển khai của một đối tượng không được tiết lộ cho các thành phần khác. Các thuộc tính dữ liệu của một lớp được ẩn và truy cập thông qua các phương thức hoặc thuộc tính được công khai. Điều này giúp kiểm soát cách lấy và thiết lập dữ liệu của một lớp và tạo sự mềm dẻo và dễ dàng khi thay đổi mã.
Ví dụ, chúng ta có một lớp BankAccount như sau:
class BankAccount {
private double balance = 0;
public void deposit(double x) {
if (x > 0) {
this.balance += x;
}
}
}
Trong ví dụ trên, biến balance
được ẩn và không thể truy cập trực tiếp từ bên ngoài. Muốn thay đổi giá trị của balance
, chúng ta phải sử dụng phương thức deposit
, phương thức này sẽ kiểm tra tính hợp lệ của dữ liệu trước khi thực hiện việc cộng giá trị vào biến.
Một số lợi ích của tính đóng gói như sau:
- Điều khiển cách lấy và thiết lập dữ liệu của một lớp.
- Dễ dàng thay đổi code mà không ảnh hưởng đến phần khác.
- Có khả năng thay đổi một phần code mà không ảnh hưởng đến phần khác.
Tính kế thừa OOP Java
Tính kế thừa (Inheritance) trong Java cho phép một lớp nhận các thuộc tính và phương thức từ một lớp khác. Lớp nhận được các thuộc tính gọi là lớp con, lớp kia gọi là lớp cha. Trong Java, chúng ta sử dụng từ khóa extends
để khai báo lớp con kế thừa từ lớp cha. Java hỗ trợ kế thừa đơn, điều này có nghĩa là một lớp con chỉ có thể kế thừa từ một lớp cha duy nhất.
Ví dụ, chúng ta có lớp Animal làm lớp cha:
class Animal {
protected int legs;
public void eat() {
System.out.println("Animal ăn");
}
}
Bây giờ chúng ta khai báo lớp Dog kế thừa từ lớp Animal:
class Dog extends Animal {
public Dog() {
this.legs = 4;
}
}
Trong ví dụ trên, Dog là lớp con và Animal là lớp cha. Lớp con kế thừa thuộc tính legs
và phương thức eat
từ lớp cha. Chúng ta có thể sử dụng như sau:
Dog d = new Dog();
d.eat(); // Kết quả: "Animal ăn"
Tính đa hình trong lập trình hướng đối tượng Java
Tính đa hình (Polymorphism) trong Java cho phép gọi một phương thức sẽ có thể có sự khác nhau khi thực thi, phụ thuộc vào kiểu đối tượng ở thời điểm thực thi.
Ví dụ, chúng ta có các lớp Animal, Cat và Dog như sau:
class Animal {
public void makeSound() {
System.out.println("Gầm...");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meo meo");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Gâu gâu");
}
}
Trong ví dụ trên, Cat và Dog kế thừa từ Animal, vì vậy các đối tượng tạo ra bởi Cat và Dog đều có thể được coi là đối tượng Animal. Khi chúng ta gọi phương thức makeSound()
, kết quả sẽ khác nhau tùy thuộc vào kiểu đối tượng.
public static void main(String[] args) {
Animal a = new Dog();
Animal b = new Cat();
a.makeSound(); // Kết quả: "Gâu gâu"
b.makeSound(); // Kết quả: "Meo meo"
}
Trong ví dụ trên, cả a và b đều là Animal, nhưng khi gọi phương thức makeSound()
, chúng ứng xử khác nhau. Đây là tính đa hình trong lập trình hướng đối tượng.