Lập trình hướng đối tượng (OOP) là một mô hình lập trình phổ biến, đặc biệt là trong ngôn ngữ lập trình Java. OOP tập trung vào việc sử dụng các "đối tượng" để mô hình hóa và giải quyết các vấn đề trong lập trình. Java, với cấu trúc và cú pháp của mình, hỗ trợ mạnh mẽ cho OOP thông qua bốn tính chất cơ bản: Tính đóng gói, Tính kế thừa, Tính đa hình, và Tính trừu tượng
Tính Đóng Gói (Encapsulation)
Định Nghĩa
Tính đóng gói là một cơ chế của OOP giúp hạn chế quyền truy cập trực tiếp vào dữ liệu của đối tượng từ bên ngoài. Điều này được thực hiện thông qua việc sử dụng các phương thức getter và setter để truy cập và cập nhật giá trị của các biến private trong class
Ví Dụ
java
public class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0) {
this.age = age;
}
}
}
Trong ví dụ trên, các thuộc tính name
và age
của class Employee
được đánh dấu là private, điều này ngăn không cho truy cập trực tiếp từ bên ngoài class. Thay vào đó, các phương thức getter và setter được sử dụng để truy cập và cập nhật giá trị của chúng một cách an toàn.
Tính Kế Thừa (Inheritance)
Định Nghĩa
Tính kế thừa cho phép một class kế thừa các thuộc tính và phương thức của một class khác. Class kế thừa được gọi là class con, và class được kế thừa là class cha
Ví Dụ
java
public class Person {
protected String name;
protected int age;
public void display() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public void display() {
super.display();
System.out.println("School: " + school);
}
}
Trong ví dụ này, class Student
kế thừa class Person
. Nó có thể sử dụng các thuộc tính và phương thức của class Person
như là chính nó. Phương thức display()
cũng được ghi đè để thêm thông tin về trường học.
Tính Đa Hình (Polymorphism)
Định Nghĩa
Tính đa hình cho phép các đối tượng được xử lý dựa trên hình thái của chúng mà không cần biết chính xác lớp hoặc đối tượng cụ thể nào đang được thao tác[1].
Ví Dụ
java
public class Animal {
public void sound() {
System.out.println("Some sound");
}
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("Bark");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // Outputs: Bark
myCat.sound(); // Outputs: Meow
}
}
Trong ví dụ trên, phương thức sound()
được ghi đè trong cả hai class Dog
và Cat
. Khi phương thức này được gọi thông qua đối tượng của class Animal
, Java sẽ xác định tại runtime đối tượng nào đang được tham chiếu và sử dụng phiên bản phương thức tương ứng.
Tính Trừu Tượng (Abstraction)
Định Nghĩa
Tính trừu tượng cho phép lập trình viên tập trung vào những gì một đối tượng làm thay vì cách thức thực hiện của nó, thường được thực hiện thông qua việc sử dụng các class trừu tượng và interfaces[1].
Ví Dụ
java
public abstract class Shape {
public abstract void draw();
}
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
public class Square extends Shape {
@Override
public void draw() {
System.out.println("Drawing a square");
}
}
public class Main {
public static void main(String[] args) {
Shape myCircle = new Circle();
Shape mySquare = new Square();
myCircle.draw(); // Outputs: Drawing a circle
mySquare.draw(); // Outputs: Drawing a square
}
}
Trong ví dụ này, Shape
là một class trừu tượng với phương thức trừu tượng draw()
. Các class con như Circle
và Square
cần phải cung cấp các triển khai cụ thể cho phương thức này. Điều này giúp đảm bảo rằng mọi hình dạng đều có phương thức draw()
mà không cần quan tâm đến chi tiết cụ thể của từng hình.
Kết Luận
Bốn tính chất của lập trình hướng đối tượng trong Java cung cấp một khung sườn mạnh mẽ cho việc phát triển phần mềm, cho phép các lập trình viên xây dựng các ứng dụng hiệu quả, dễ bảo trì và mở rộng. Hiểu biết sâu sắc về các tính chất này và cách chúng tương tác với nhau là rất quan trọng đối với bất kỳ ai muốn trở thành một lập trình viên Java chuyên nghiệp.