Tìm hiểu về OOP Java: Lập trình hướng đối tượng Java

By 25/01/2021Tháng Sáu 10th, 2021Java, KIẾN THỨC LẬP TRÌNH

Lập hướng đối tượng hay OOP là phương thức rất được sự tin dùng của các lập trình viên. Vậy lập trình hướng đối tượng Java sẽ có đặc điểm hay khái niệm gì cần phải chú ý? Những thông tin nào mà người dùng và người học phương thức này cần biết?

Bài viết sau sẽ giải đáp cho các bạn, một cách chi tiết nhất:

1. Lập trình hướng đối tượng trong Java là gì?

OOP là viết tắt của Object-Oriented Programming, hay còn được gọi lập trình hướng đối tượng.

Lập trình thủ tục là viết các thủ tục hoặc phương thức thực hiện các hoạt động trên dữ liệu. Còn lập trình hướng đối tượng là tạo các đối tượng chứa cả dữ liệu và phương thức. OOP giúp tăng năng suất, dễ dàng mở rộng trong thiết kế phần mềm, đơn giản hóa việc bảo trì.

Lập trình hướng đối tượng có một số ưu điểm so với lập trình thủ tục:

  • OOP nhanh hơn và dễ thực thi hơn
  • OOP cung cấp một cấu trúc rõ ràng cho các chương trình
  • OOP giúp giữ cho mã Java DRY “Don’t Repeat Yourself” và làm cho mã dễ bảo trì, sửa đổi và gỡ lỗi hơn
  • OOP giúp bạn có thể tạo các ứng dụng có thể tái sử dụng đầy đủ với ít mã hơn và thời gian phát triển ngắn hơn

Mẹo: Nguyên tắc “Don’t Repeat Yourself” (DRY) được hiểu là không lặp lại các cấu trúc code đã có sẵn. Bạn nên trích xuất các code phổ biến cho ứng dụng và lưu trữ chúng để sử dụng lại thay vì lặp lại.

2. Lớp và đối tượng trong Java 

Lớp (Class) và đối tượng (Objects) là hai khía cạnh chính của lập trình hướng đối tượng java.

Lớp là một nhóm đối tượng có các thuộc tính chung, là một thực thể logic . Đối tượng là một thể hiện kết quả, thực thể của một lớp. Đối tượng có thể là đối tượng vật lý hoặc là đối tượng logic.

Một lớp trong java có thể chứa:

  • Thành viên dữ liệu
  • Constructor
  • Phương thức
  • Khối lệnh
  • Lớp và Interface

Xem ví dụ vào minh họa sau để thấy sự khác biệt giữa lớp và các đối tượng:

Lớp học Các đối tượng
Left tree Cam Chanh Táo

Một ví dụ khác:

Lớp học Các đối tượng
xe hơi Volvo Audi Toyota

Vì vậy, lớp là khuôn mẫu cho các đối tượng và đối tượng là hình thức thể hiện cho trạng thái hoặc phương thức của một lớp.

Khi các đối tượng riêng lẻ được tạo, chúng kế thừa tất cả các biến và phương thức từ lớp.

3. 4 thuộc tính của OOP trong Java

Có bốn khái niệm OOP chính trong Java. Đó là:

Tính trừu tượng

Trừu tượng nghĩa là sử dụng những thứ đơn giản để thể hiện sự phức tạp. Hay còn được hiểu đơn giản hơn là tổng quát hóa các thuộc tính, phương thức của thuộc tính. Ví dụ như để bật được tivi, chúng ta chỉ cần bấm vào nút điều khiển ở remote tivi, còn nguyên lý hay cách thức hoạt động của remote sau khi ấn nút để mở tivi thì chúng ta không cần quan tâm.

Tính trừu tượng trong Java cũng vậy. Những thứ đơn giản như đối tượng (Object), lớp (Class) và biến (Variable) sẽ đại diện cho code và dữ liệu phức tạp hơn.

Tính trừu tượng giúp bạn tập trung vào những yếu tố cốt lõi của đối tượng. Điều này cho phép tránh lặp lại cùng một công việc nhiều lần.

Tính đóng gói

Đây là cách thực hiện giữa các trường trong một lớp ở chế độ riêng tư. Sau đó cung cấp quyền truy cập vào chúng thông qua các phương thức công khai.

Đó là một hàng rào bảo vệ giữ cho dữ liệu và code an toàn trong chính lớp đó. Bằng cách này, chúng ta có thể sử dụng lại các đối tượng như thành phần code hoặc biến mà không cho phép truy cập mở vào toàn bộ hệ thống dữ liệu.

Tính di sản

Đây là một tính năng đặc biệt của lập trình hướng đối tượng trong Java. Nó cho phép các lập trình viên tạo các lớp mới chia sẻ một số thuộc tính của các lớp hiện có. Điều này cho phép người dùng có thể sử dụng các thuộc tính trên các lớp trước đó mà không cần viết lại.

Tính đa hình

Khái niệm tính đa hình của Java OOP này, cho phép các lập trình viên sử dụng cùng đối tượng để thực hiện những tác vụ khác nhau – một dạng đa hình trong Java. Đây là phương thức nạp chồng khi một lớp có nhiều thuộc tính, phương thức cùng tên nhưng khác nhau về 1 số tham số khác.

Hình thức khác là phương thức ghi đè. Đây là hai phương thức cùng tên, cùng tham số, cùng kiểu trả về. Nó xuất hiện ở lớp cha và tiếp tục xuất hiện ở cả lớp con.

4. Cách thức hoạt động của thuộc tính OOP trong Java

Kế thừa (Inheritance)

Kế thừa là một trong 4 cách thức hoạt động của Java OOP với mục đích tránh lặp lại các đoạn code, tiết kiệm được thời gian cho người dùng.

Nó hoạt động bằng cách cho phép một lớp mới áp dụng các thuộc tính của lớp khác. Chúng ta gọi lớp kế thừa là lớp con. Lớp ban đầu thường được gọi là lớp cha. Chúng tôi sử dụng từ khóa expand để định nghĩa một lớp mới kế thừa các thuộc tính từ một lớp cũ.

Đóng gói (Encapsulation)

Tính năng đóng gói cho phép sử dụng lại chức năng có sẵn, nghĩa là mỗi “gói” được xây dựng để thực hiện một chức năng đặc biệt của nó. Bên cạnh đó chức năng đóng gói còn để bảo mật một số hàm, phương thức hoặc giá trị của đối tượng, không để bên ngoài nhìn thấy cũng như không thể tác động vào.

Đó là một cách thức hoạt động mạnh mẽ  của OOP trong Java. Và nó giúp chúng ta tiết kiệm rất nhiều thời gian.

Ví dụ: Chúng tôi có thể tạo một đoạn code gọi dữ liệu cụ thể từ cơ sở dữ liệu. Tính năng đóng gói sẽ rất hữu ích khi cho phép sử dụng lại code đó với cơ sở dữ liệu hoặc quy trình khác, trong khi vẫn giữ dữ liệu ban đầu  ở chế độ riêng tư. Ngoài ra, nó cũng cho phép chúng tôi thay đổi code gốc của mình mà không ảnh hưởng đến những người dùng khác.

Trừu tượng (Abstraction)

Tính trừu tượng cũng là một trong những thuộc tính OOP trong Java, hoạt động bằng cách cho phép các lập trình viên tạo ra các công cụ hữu ích và có thể tái sử dụng.

Ví dụ: Một lập trình viên có thể tạo một số loại đối tượng khác nhau (có thể là các biến, hàm hoặc cấu trúc dữ liệu). Người lập trình cũng có thể tạo các lớp đối tượng khác nhau (những cách để xác định các đối tượng).

Một ví dụ điểm hình, “lớp” (class) biến có thể là “địa chỉ”. Lớp có thể chỉ định rằng, mỗi đối tượng “địa chỉ” có  số nhà, tên đường, quận/huyện, thành phố và mã zip.  Đối tượng, trong trường hợp này có thể là địa chỉ nhân viên, địa chỉ khách hàng hoặc địa chỉ nhà cung cấp.

Đa hình (Polymorphism)

Tính đa hình trong Java hoạt động bằng cách sử dụng một tham chiếu đến lớp cha để ảnh hưởng đến một đối tượng trong lớp con. Chúng ta có thể tạo một lớp gọi là “ngựa” bằng cách mở rộng lớp “động vật”. Lớp đó cũng có thể triển khai lớp “đua xe chuyên nghiệp”. Lớp “ngựa” là “đa hình”, vì nó kế thừa các thuộc tính của cả lớp “động vật” và “đua chuyên nghiệp”.

Hai ví dụ khác về tính đa hình trong Java là ghi đè và nạp chồng (xếp chồng).

Trong phương thức ghi đè, lớp con có thể sử dụng khái niệm đa hình OOP để ghi đè một phương thức của lớp cha. Điều đó cho phép lập trình viên sử dụng một phương thức theo những cách khác nhau tùy thuộc vào việc nó được gọi bởi một đối tượng của lớp cha hay một đối tượng của lớp con.

Trong phương thức nạp chồng, một phương thức đơn lẻ có thể thực hiện các chức năng khác nhau tùy thuộc vào ngữ cảnh mà nó được gọi. Có nghĩa là, một tên phương thức duy nhất có thể hoạt động theo những cách khác nhau, tùy thuộc vào đối số nào được truyền cho nó.

5. Ví dụ về OOP trong Java

Ví dụ về tính Đóng gói trong Java

Biến “name” được giữ riêng tư hoặc  “Encapsulated” (Encapsulated_Đóng gói trong Java là một quá trình gói mã và dữ liệu lại với nhau thành một đơn vị duy nhất.)

hướng đối tượng trong java

Đoạn code mô tả quy trình Đóng gói trong Java

Ví dụ về tính Kế thừa trong Java

Tính kế thừa được tạo ra khá đơn giản bằng cách sử dụng từ khóa mở rộng (extends).

lap trinh huong doi tuong java

Ví dụ về tính Kế thừa trong Java

Ví dụ về tính Đa hình trong Java

Trong ví dụ dưới đây về tính đa hình, chúng ta có hai lớp: Person và Employee. Lớp Employee kế thừa từ lớp Person bằng cách sử dụng từ khóa expand . Ở đây, lớp con ghi đè lớp cha.

oop java

Tính đa hình trong lập trình oop java

6. Một số mẹo thực hành OOP trong Java tốt hơn

Vì mục đích của sử dụng OOP trong Java là tiết kiệm thời gian mà vẫn giữ được  tính bảo mật và dễ sử dụng.

DRY (Don’t Repeat Yourself): Đây là khái niệm cốt lõi trong Java. Bạn không nên có hai khối mã giống hệt nhau ở hai nơi khác nhau. Thay vào đó, hãy sử dụng  cùng một phương pháp cho các ứng dụng khác nhau.

Nếu bạn muốn chỉnh sửa code Java của mình, hãy dùng thuộc tính đóng gói bằng cách đặt tất cả các biến và phương thức ở chế độ riêng tư ngay từ đầu. Khi code thay đổi, hãy chuyển quyền truy cập thành “protected” nếu cần, nhưng không quá công khai.

Single Responsibility (Trách nhiệm đơn lẻ): Một trong những tip để bạn luyện tập OOP trong Java là Single Responsibility Principle. Hiểu đơn giản là, một lớp phải luôn chỉ có một chức năng nhất định. Bằng cách đó, nó có thể được gọi hoặc mở rộng trên riêng nó, khi sử dụng mới phát sinh, mà không gây ra ghép nối giữa các chức năng khác nhau. 

Thiết kế đóng mở: Tạo tất cả các phương thức và lớp đóng để sửa đổi. Nhưng Open (mở) để mở rộng. Bằng cách đó, code đã thử và đã kiểm tra có thể vẫn trong tình trạng tĩnh. Nhưng vẫn có thể được sửa đổi để thực hiện các nhiệm vụ mới khi cần.

Tóm lại, trong lập trình hướng đối tượng java có cung cấp một vài khái niệm như: Đối tượng, Lớp, Kế thừa, Đa hình, Trừu tượng, Đóng gói. Bạn cần nắm rõ về chúng vì nó rất quan trọng.

Hy vọng bài viết có thể hỗ trợ cho bạn hiểu rõ hơn về OOP Java. 

Để lại một câu trả lời