Lập trình hướng đối tượng java là gì năm 2024

Lập trình hướng đối tượng (Object-Oriented Programming – OOP) là một phương pháp lập trình mạnh mẽ và phổ biến trong thế giới phát triển phần mềm. Nó đã trở thành tiêu chuẩn cho nhiều ngôn ngữ lập trình như Java, PHP, .NET, Ruby, Python và nhiều ngôn ngữ khác. OOP giúp tạo ra các ứng dụng phức tạp bằng cách sử dụng mô hình lập trình dựa trên các đối tượng có khả năng tương tác với nhau.

Lập trình hướng đối tượng java là gì năm 2024

Đối tượng

Tại cơ bản, OOP xoay quanh hai khái niệm quan trọng: đối tượng và lớp.

Đối tượng là một thực thể cụ thể trong thế giới thực, có các đặc điểm cụ thể và có thể thực hiện các hành động. Mỗi đối tượng có hai thành phần chính:

  • Thuộc tính: Đây là các thông tin và đặc điểm của đối tượng. Ví dụ, một đối tượng "Người" có thể có thuộc tính như tên, tuổi, địa chỉ.
  • Phương thức: Đây là các hành động mà đối tượng có thể thực hiện. Ví dụ, đối tượng "Người" có thể có phương thức như đi, nói, ăn, uống.

Lớp

Lớp là một khuôn mẫu hoặc một mô tả trừu tượng của các đối tượng. Nó định nghĩa các thuộc tính và phương thức mà tất cả các đối tượng thuộc về lớp đó sẽ có. Một lớp là một cách để tạo ra các đối tượng có cấu trúc và hành vi tương tự.

Ví dụ, nếu chúng ta định nghĩa lớp "Học sinh," thì tất cả các đối tượng thuộc lớp này sẽ có các thuộc tính như tên, tuổi, và các phương thức như học bài, nộp bài tập.

Sự khác biệt giữa đối tượng và lớp

Để hiểu rõ hơn sự khác biệt giữa đối tượng và lớp, hãy xem xét ví dụ về "Xe hơi." Lớp "Xe hơi" có thể định nghĩa các thuộc tính như màu sắc, thương hiệu và model của xe hơi. Một đối tượng cụ thể của lớp "Xe hơi" có thể là chiếc xe cụ thể, chẳng hạn một chiếc xe màu đỏ, thương hiệu Toyota, model Camry.

Lập trình hướng đối tượng java là gì năm 2024

Sự khác biệt giữa đối tượng và lớp giúp tổ chức mã nguồn và quản lý dự án phần mềm một cách hiệu quả. Lớp định nghĩa cấu trúc và hành vi chung, trong khi đối tượng thể hiện các phiên bản cụ thể của lớp đó.

Các ưu điểm của lập trình hướng đối tượng

Lập trình hướng đối tượng mang lại nhiều lợi ích quan trọng:

  1. Tái sử dụng mã nguồn: Bằng cách sử dụng lớp và đối tượng, bạn có thể tái sử dụng mã nguồn dễ dàng. Điều này giúp giảm sự lặp lại trong mã và tạo ra mã dễ bảo trì hơn.
  2. Tính đa hình: OOP cho phép bạn sử dụng tính đa hình, nghĩa là bạn có thể sử dụng các đối tượng cùng một lớp một cách đa dạng. Ví dụ, bạn có thể sử dụng một phương thức "di chuyển" cho nhiều loại đối tượng khác nhau, như "Người" và "Xe hơi."
  3. Tính bảo mật và đóng gói: OOP cho phép bạn ẩn thông tin cần thiết và chỉ tiết lộ thông qua các phương thức công khai. Điều này giúp bảo vệ dữ liệu và ngăn chặn truy cập trực tiếp đến các thuộc tính của đối tượng.
  4. Mô hình hóa thế giới thực: OOP cho phép biểu diễn thế giới thực trên máy tính một cách tự nhiên hơn bằng cách sử dụng các đối tượng và lớp tương ứng với các thực thể và khái niệm trong thế giới thực.

Lập trình hướng đối tượng là một phần quan trọng của phát triển phần mềm hiện đại và cung cấp một cách cấu trúc hóa và quản lý mã nguồn mạnh mẽ, giúp tạo ra các ứng dụng phức tạp và dễ bảo trì.

Chúng ta đang sử dụng các ngôn ngữ lập trình để giải quyết các vấn đề trong cuộc sống hàng ngày. Vì thế sẽ không lý gì chúng ta lại không thể mô hình các vấn đề này sang các ngôn ngữ lập trình hướng đối tượng. Đây chính là nơi mà lập trình hướng đối tượng (Object-oriented programming) phát huy vai trò của nó.

1. OOP là gì

OOP là viết tắt của Object-oriented programming (lập trình hướng đối tượng). OOP là một mô hình lập trình dựa trên khái niệm Object (đối tượng), mà trong đó thường chứa 2 thành phần: data và code.

  • Data thường dưới dạng các fields, hay còn gọi là các attributes hoặc properties (tạm dịch chung là các thuộc tính).
  • Code thường dưới dạng các procedures, hay còn gọi là methods (tạm dịch là các phương thức).

2. Các thành phần chính trong OOP

Lập trình hướng đối tượng java là gì năm 2024
Các thành phần trong OOP - Lập trình hướng đối tượng

Trong OOP sẽ bao gồm 2 thành phần chính là Class và Object:

2.1 Class (lớp) trong OOP:

Class (lớp) trong OOP là các template hay cấu trúc để phục vụ cho việc xây dựng nên các Object (đối tượng). Trong đó sẽ bao gồm một tập hợp các Attribute và Methods đẻ định nghĩa các đặc tính và hành vi cho các Object.

  • Attributes: định nghĩa các thông tin, đặc điểm cũng như các thuộc tính của Object.
  • Methods: định nghĩa các hành vi, phương thức cũng như các hành động thường có của Object.

Ví dụ ta có Class Person với các attributes là: Họ tên, tuổi tác, nghề nghiệp và methods là: ăn, ngủ, đi làm.

2.2 Object (đối tượng) trong OOP:

Object (đối tượng) là một instance của Class, có thể hiểu là một hiện thực hay ví dụ cụ thể của một Class. Vì thế Object khi khởi tạo sẽ mang đầy đủ thông tin cụ thể mà Class đã định nghĩa.

Lập trình hướng đối tượng java là gì năm 2024
Ví dụ class Person và các Objects cụ thể - OOP

3. 4 tính chất cơ bản trong OOP

Lập trình hướng đối tượng java là gì năm 2024
OOP - 4 tính chất cơ bản

3.1 Encapsulation (tính đóng gói)

Encapsulation là một kỹ thuật lập trình nền tảng được sử dụng để gom nhóm các attributes và methods cần thiết vào một Object. Kỹ thuật này còn được biết với tên gọi khác là Data/Information Hiding.

Data Hiding trong lập trình hướng đối tượng OOP thường dùng để bảo vệ các thành phần bên trong của Object (thường gọi là private). Các thành phần bên ngoài sẽ không được can thiệp và sử dụng các thành phần này trực tiếp mà phải thông qua các phương thức công khai (public).

Lập trình hướng đối tượng java là gì năm 2024
OOP - Encapsulation (tính đóng gói)

3.1.1 Ví dụ cho Encapsulation

Ta có Class Account bao gồm 2 attributes cơ bản là namebalance. Trong thực tế đây là 2 thông tin quan trọng cần được bảo vệ, vì thế chúng sẽ là private attributes. Bên ngoài chỉ có thể sử dụng thông qua các phương thức public như:

  • GetName(): trả về name của Account.
  • GetBalance(): trả về gía trị balance hiện có của Account.
  • Deposite(amount): nạp tiền vào Account.
  • Withdraw(amount): rút tiền từ Account.

Từ đó phía bên ngoài chỉ có thể sử dụng được các public methods trên. Bên ngoài cũng không cần biết các method trong Account chạy như thế nào. Tương lai nếu logic các method trên thay đổi cũng không ảnh hưởng.

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

Abstraction trong lập trình hướng đối tượng OOP là một kỹ thuật lập trình dùng để đơn giản hoá cấu trúc của chương trình, tập trung vào những phần quan trọng và có ý nghĩa. Những phần phức tạp sẽ được loại bỏ hay ẩn giấu đi (hiding).

3.2.1 Ví dụ cho Abstraction

Chúng ta có class UIElement đại diện cho tất cả các thành phần trong UI (User Interface - giao diện người dùng). Mỗi element có phương thức render() để hiển thị.

Vấn đề ở đây là phương thức render được viết như thế nào trong class UIElement?! Không thể viết được!! Vì ta không biết element này là Button, hay Link, hay Image,... Vì thế render() là một phương thức trừu tượng (abstract method). Từ đó UIElement trở thành một abstract class.

Các element cụ thể sẽ kế thừa class UIElement và viết logic hiển thị cho bản thân chúng.

3.3 Inheritance (tính kế thừa)

Inheritance trong lập trình hướng đối tượng OOP là một cơ chế xây dựng class mới dựa trên các class đã có. Các class kế thừa sẽ bao gồm toàn bộ các attributes và methods từ base class (lớp cơ sở) hay parent class (lớp cha).

Sử dụng Inheritance sẽ giúp các nhà phát triển tái sử dụng được các class đã có, giảm thiểu các duplication (sự trùng lặp) không cần thiết.

Inheritance trong OOP bao gồm 2 loại chính:

  • Single Inheritance (đơn kế thừa): class chỉ có thể kế thừa từ một parent class duy nhất.
  • Multiple inheritance (đa kế thừa): class có thể kế thừa từ nhiều parent class.

Đa số các ngôn ngữ lập trình hướng đối tượng OOP chỉ hỗ trợ Single Inheritance.

3.3.1 "Is-a" relationship trong Single Inheritance

"Is-a" relationship là một phương hướng để chúng ta có thể xác định khi nào nên sử dụng kế thừa trong OOP.

Ví dụ một số trường hợp cho "is-a" relationship:

  • Car is a Vehicle từ đó class Car kế thừa class Vehicle.
  • Cat is a Pet từ đó class Cat kế thừa class Pet.
  • Button is an UIElement từ đó class Button kế thừa class UIElement.

3.3.2 "Has-a" relationship

"Has-a" relationship là một kỹ thuật nhằm thay thế cho kế thừa. Thay vì kế thừa, chúng ta sẽ phối hợp hay tổng hợp các class hiện có để tạo thành các class lớn hơn.

Trên thực tế, "Has-a" relationship giúp chúng ta vượt qua giới hạn Single Inheritance và thêm linh hoạt cho việc thiết kế các class trong OOP. Kỹ thuật này thường được biết với tên khác là Composition hoặc Aggregation.

Ví dụ một số trường hợp cho "Has-a" relationship:

  • Car has an Engine từ đó class Car có attribute là class Engine.
  • Order belongs to a Customer, has many Products từ đó class Order có các attribute Customer và Product.

3.4 Polymorphism (tính đa hình)

Polymorphism trong lập trình hướng đối tượng OOP cho phép một Object có thể có nhiều hình dạng và hành vi khác nhau.

Bản chất từ Polymorphism cấu tạo từ 2 chữ Hy Lạp: "poly" nghĩa là nhiều và "morph" nghĩa là hình dạng. Từ đó Polymorphism có thể tạm dịch là "đa hình".

Polymorphism trong OOP được chia làm 2 loại:

  • Static Polymorphism (đa hình tĩnh): là cơ chế định nghĩa lại các methods cùng tên, nhưng có thể khác số lượng hoặc kiểu của tham số. Static Polymorphism còn được gọi là Method Overloading.
  • Dynamic Polymorphism (đa hình động): là cơ chế định nghĩa lại các methods cùng tên, cùng tham số và kiểu trả về từ parent class. Dynamic Polymorphism còn được gọi là Method Overriding.
    Lập trình hướng đối tượng java là gì năm 2024
    Static Polymorphism vs Dynamic Polymorphism trong OOP

Sự khác biệt lớn nhất giữa Static và Dynamic Polymorphism là: Static Polymorphism được xử lý tại thời điểm biên dịch (compile-time). Dynamic Polymorphism được xử lý tại thời điểm chạy chương trình (runtime).

4. Vì sao nên học OOP

Có một sự thật hiển nhiên rằng dù cho chúng ta có đang sử dụng ngôn ngữ lập trình OOP hay không thì việc nắm vững OOP vẫn luôn cần thiết.