Java OOP – Kỹ thuật lập trình hướng đối tượng

OPP 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 sử dụng “đối tượng” để biểu diễn và thao tác dữ liệu. OPP giúp giải quyết các vấn đề phức tạp trong lập trình bằng cách chia các vấn đề thành các đối tượng nhỏ hơn và dễ quản lý hơn.

Trong OOP, dữ liệu được đóng gói trong các đối tượng và các đối tượng được xác định bởi các thuộc tính (attributes) và hành vi (methods) của chúng. Ở đây, chúng ta sẽ đi sâu vào 4 tính chất OOP của Java bao gồm trừu tượng (abstraction), đóng gói (Encapsulation), kế thừa (Inheritance) và đa hình (Polymorrphism).

Tính kế thừa (Inheritance)

Tình chất đầu tiên trong 4 tính chất OOP Java chính là tính kế thừa. Tính kế thừa cho phép xây dựng các lớp mới trên cơ sở của lớp hiện có. Lớp mới (con) sẽ được kế thừa các thuộc tính và phương thức của lớp cha. Nó tương tự một đứa trẻ sẽ kế thừa các đặc điểm như màu da, màu tóc, cách nói chuyện…của cha mẹ.

4 Tinh Chat Opp Java Rikkei Academy
Tính kế thừa tương tự như một đứa trẻ kế thừa các đặc điểm của bố mẹ

Việc sử dụng kế thừa giúp tiết kiệm thời gian và nỗ lực trong việc lập trình và giảm thiểu lỗi lặp lại. Nó cũng giúp tăng tính tái sử dụng của mã lập trình.

Tính kế thừa thể hiện trong Java

Trong Java, để kế thừa các thuộc tính và phương thức của một lớp cha, chúng ta sử dụng từ khóa “extends” khi khai báo lớp con. Ví dụ:

class Animal {
// các thuộc tính và phương thức của lớp Animal

}

class Dog extends Animal {

// các thuộc tính và phương thức của lớp Dog

}

Ta có lớp Animal với các thuộc tính và phương thức chung cho các loài động vật, chúng ta tạo lớp Dog kế thừa từ lớp Animal thông qua từ khóa “extends”. Các lớp con này có các thuộc tính và phương thức riêng của chúng, nhưng vẫn có các thuộc tính và phương thức chung được kế thừa từ lớp cha Animal.

Lưu ý: Ngoài ra việc sử dụng từ khóa “extends”, chúng ta có thể sử dụng Interface trong Java để đạt được tính kế thừa.

Tính đa hình (Polymorphism)

Tính đa hình (Polymorphism) là khả năng của đối tượng (object) thể hiện các hành vi khác nhau khi được gọi bằng cùng một phương thức. Nó cho phép các đối tượng của các lớp khác nhau có thể đáp ứng một cách khác nhau với cùng một phương thức. Ví dụ, một người với việc di chuyển thì họ có thể lựa chọn đi bộ, chạy hay ngồi phương tiện.

Tính đa hình giúp làm giảm sự phức tạp của mã lập trình, tăng tính linh hoạt của chương trình và giảm thiểu lỗi lặp lại.

Tính đa hình thể hiện trong Java

Trong Java, tính đa hình được thể hiện thông qua việc sử dụng phương thức ghi đè (override) và nạp chồng (overload):

  • Trong ghi đè (override), lớp con thay đổi lại một phương thức đã được định nghĩa trong lớp cha. Khi một đối tượng của lớp con gọi phương thức đó, nó sẽ thực thi phương thức mới của lớp con thay vì phương thức cũ của lớp cha.
  • Trong nạp chồng (overload), một phương thức duy nhất có thể thực hiện các chức năng khác nhau tùy thuộc vào ngữ cảnh trong đó nó được gọi.
  • Sử dụng đối tượng đa hình (Polymorphic Objects), biến thuộc lớp cha có thể tham chiếu đến đối tượng của lớp con, khiến biến thuộc lớp cha cũng có thể đáp ứng với các phương thức của lớp con.

Ví dụ: Ở đây, chúng ta có một phương thức makeSound() trong lớp Animal, và các lớp con Dog ghi đè phương thức này để cài đặt tiếng kêu riêng của chúng.

class Animal {
public void makeSound() {

System.out.println(“The animal makes a sound”);

}

}

class Dog extends Animal {

@Override

public void makeSound() {

System.out.println(“The dog barks”);

super.makeSound(); // gọi phương thức makeSound() của lớp cha

}

}

Tính đóng gói (Encapsulation)

Tính đóng gói (Encapsulation) cho phép chúng ta giấu thông tin của đối tượng và chỉ cho phép các phương thức được định nghĩa trong lớp đó mới có thể truy cập và sử dụng các thuộc tính và phương thức đó. Nó giúp che dấu và bảo vệ dữ liệu bên trong đối tượng khỏi truy cập trực tiếp từ bên ngoài. Điều này giúp giảm thiểu sự phụ thuộc giữa các đối tượng và tăng tính bảo mật cho chương trình.

Ví dụ, mỗi người đều có thông tin cá nhân và để tránh sự xâm nhập của người không liên quan, chúng ta sẽ đóng gói thông tin của mình vào một nơi và bảo mật bằng cách đặt mật khẩu.

Tính đóng gói thể hiện trong Java

Trong Java, tính đóng gói được thực hiện bằng cách sử dụng các từ khóa truy cập (access modifiers), điều khiển khả năng nhìn thấy của biến và phương thức trong một lớp. Ba từ khóa truy cập trong Java bao gồm:

  • Public: Các biến và phương thức công khai (public) có thể truy cập từ bất kỳ đâu, bao gồm bên ngoài lớp.
  • Private: Các biến và phương thức riêng tư (private) chỉ có thể truy cập trong lớp mà chúng được định nghĩa.
  • Protected: Các biến và phương thức được bảo vệ (protected) có thể truy cập được trong cùng lớp và các lớp con của nó.

Ví dụ:

class Person {
private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Tính trừu tượng (Abstraction)

Trừu tượng là tính chất cuối cùng trong 4 tính chất OOP Java chúng ta tìm hiểu trong bài viết này. Tính trừu tượng cho phép chúng ta tạo ra các lớp trừu tượng mà không cần cung cấp các triển khai cụ thể cho các phương thức của chúng. Ví dụ, chúng ta có thể mô tả một chiếc xe dựa trên màu sắc, hiệu xe và số chỗ ngồi mà không cần biết chi tiết về cấu tạo bên trong của xe.

4 Tinh Chat Opp Java Rikkei Academy
Tính trừu tượng cho phép tạo ra các lớp trừu tượng mà không cần cung cấp các phương thức triển khai cụ thể

Việc sử dụng tính trừu tượng giúp tăng tính linh hoạt của chương trình, cho phép chúng ta dễ dàng thay đổi hoặc thêm mới các phương thức mà không ảnh hưởng đến các lớp khác trong chương trình. Nó cũng giúp giảm sự phức tạp của mã lập trình bằng cách tập trung vào các hành động cần thiết của đối tượng mà không cần quan tâm đến các chi tiết cài đặt cụ thể.

Tính trừu tượng thể hiện trong Java

Bạn có thể đạt được trừu tượng thông qua hai cơ chế chính:

  • Abstract class trong Java (Lớp trừu tượng) giúp đạt được tính trừu tượng từ 0 đến 100%.
  • Interfaces trong Java (giao diện) giúp đạt tính trừu tượng đến 100%.

Ví dụ:

abstract class Shape {
  protected int x;
  protected int y;
  public Shape(int x, int y) {
    this.x = x;
    this.y = y;
  }
  public abstract void draw();
}
class Circle extends Shape {
  private int radius;
  public Circle(int x, int y, int radius) {
    super(x, y);
    this.radius = radius;
  }
  @Override
  public void draw() {
    System.out.println(“Drawing a circle at(”+x + “, ”+y + “) with radius” + radius);
  }
}

Trên đây là 4 tính chất OOP Java cốt lõi, việc sở hữu các tính chất của ngôn ngữ lập trình hướng đối tượng giúp quá trình phát triển phần mềm bằng ngôn ngữ Java trở nên dễ dàng và tiết kiệm thời gian hơn.