Table of Contents
Trong những bài trước, tôi đã giới thiệu với các bạn Lập trình hướng đối tượng(OOPs) trong java, tính bao đóng (encapsulation), tính kế thừa (Inheritance), tính đa hình (polymorphism), tính trừu trượng (abstraction). Trong bài này, tôi sẽ tổng hợp lại 4 tính chất đó và đưa rõ ví dụ tổng hợp để các bạn dễ dàng hiểu được 4 tính chất này trong Java.
4 tính chất của lập trình hướng đối tượng trong Java
Tính đóng gói (encapsulation) và che giấu thông tin (information hiding) :
- Tức là trạng thái của đối tượng được bảo vệ không cho các truy cập từ code bên ngoài như thay đổi trong thái hay nhìn trực tiếp. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn, bảo mật của đối tượng
- Trong Java, tính đóng gói được thể hiện thông qua phạm vi truy cập (access modifier). Ngoài ra, các lớp liên quan đến nhau có thể được gom chung lại thành package.
Tính kế thừa (inheritance):
- Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con và đương nhiên kế thừa tất cả các thành phần của lớp Cha, có thể chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.
Tính đa hình (polymorphism):
- Khi một tác vụ được thực hiện theo nhiều cách khác nhau được gọi là tính đa hình.
- Đối với tính chất này, nó được thể hiện rõ nhất qua việc gọi phương thức của đối tượng. Các phương thức hoàn toàn có thể giống nhau, nhưng việc xử lý luồng có thể khác nhau. Nói cách khác: Tính đa hình cung cấp khả năng cho phép người lập trình gọi trước một phương thức của đối tượng, tuy chưa xác định đối tượng có phương thức muốn gọi hay không. Đến khi thực hiện (run-time), chương trình mới xác định được đối tượng và gọi phương thức tương ứng của đối tượng đó. Kết nối trễ giúp chương trình được uyển chuyển hơn, chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.
- Trong Java, chúng ta sử dụng nạp chồng phương thức (method overloading) và ghi đè phương thức (method overriding) để có tính đa hình.
- Nạp chồng (Overloading): Đây là khả năng cho phép một lớp có nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, phương thức tương ứng sẽ được thực hiện.
- Ghi đè (Overriding): là hai phương thức cùng tên, cùng tham số, cùng kiểu trả về nhưng thằng con viết lại và dùng theo cách của nó, và xuất hiện ở lớp cha và tiếp tục xuất hiện ở lớp con. Khi dùng override, lúc thực thi, nếu lớp Con không có phương thức riêng, phương thức của lớp Cha sẽ được gọi, ngược lại nếu có, phương thức của lớp Con được gọi.
Tính trừu tượng (abstraction):
- Tính trừu tượng là một tiến trình ẩn các chi tiết trình triển khai và chỉ hiển thị tính năng tới người dùng. Tính trừu tượng cho phép bạn loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.
- Tính trừu tượng giúp bạn tập trung vào những cốt lõi cần thiết của đối tượng thay vì quan tâm đến cách nó thực hiện.
- Trong Java, chúng là sử dụng abstract class và abstract interface để có tính trừu tượng.
Ví dụ minh họa
Animal.java
package com.maixuanvietr.oop; public abstract class Animal { private String name; public Animal(String name) { this.name = name; } public abstract void sayHello(); public String getName() { return name; } }
Cat.java
package com.maixuanvietr.oop; public class Cat extends Animal { public Cat(String name) { super(name); } @Override public void sayHello() { System.out.println("Hi, I'm " + super.getName()); } }
Dog.java
package com.maixuanvietr.oop; public class Dog extends Animal { public Dog(String name) { super(name); } @Override public void sayHello() { System.out.println("Hello, I'm " + super.getName()); } }
Zoo.java
package com.maixuanvietr.oop; import java.util.ArrayList; import java.util.List; public class Zoo { private List<Animal> animals = new ArrayList<Animal>(); public void add(Animal animal) { animals.add(animal); } public void remove(Animal animal) { animals.remove(animal); } public void showListAnimal() { for (Animal animal : animals) { animal.sayHello(); } } }
OopDemo.java
package com.maixuanvietr.oop; public class OopDemo { public static void main(String[] args) { Cat cat = new Cat("Tom"); Dog dog = new Dog("Milu"); Zoo zoo = new Zoo(); zoo.add(cat); zoo.add(dog); zoo.showListAnimal(); } }
Kết quả:
Hi, I'm Tom Hello, I'm Milu
Các tính chất của lập trình hướng đối tượng đươc sử dụng thông qua ví dụ trên:
- Tạo abstract class Animal có phương thức sayHello. abstract class này thể hiện tính trừu tượng, có nghĩa ta định ra rằng dù là con vật gì đi nữa thì nó cũng có phương thức sayHello.
- Tạo 2 lớp Cat và Dog kế thừa từ Animal. Khi khởi tạo chúng sẽ có tên. Chúng override lại phương thức sayHello để chào hỏi theo cách riêng của chúng. Điều này thể hiện tính đóng gói (đóng gói biến tên và phương thức sayHello với nhau) và tính thừa kế (Cat và Dog mang đặc điểm chung là có sayHello từ Animal).
- Tạo lớp Zoo để quản lí nhiều Animal, có (1) phương thức add, remove để thêm, bớt các Animal (các đối tượng của các lớp thừa kế từ Animal), (2) phương thức showListAnimal để gọi sayHello của tất cả đối tượng nó quản lí. Điều này thể hiện tính đa hình, Zoo gọi chỉ gọi một phương thức sayHello, nhưng tùy con vật mà lời chào hỏi sẽ khác nhau.
Related posts:
Java Program to Check for balanced parenthesis by using Stacks
The Spring @Controller and @RestController Annotations
Java Program to Check Whether a Directed Graph Contains a Eulerian Cycle
Java Program to Find Basis and Dimension of a Matrix
Java Program to Implement Best-First Search
Java Program to Check whether Graph is Biconnected
Build a REST API with Spring and Java Config
Java Program to Implement Bucket Sort
How to Manually Authenticate User with Spring Security
How to Read HTTP Headers in Spring REST Controllers
Exploring the Spring Boot TestRestTemplate
Java Program to Implement Nth Root Algorithm
Java Program to Find a Good Feedback Edge Set in a Graph
Read an Outlook MSG file
Finding the Differences Between Two Lists in Java
Java Program to Generate All Possible Combinations of a Given List of Numbers
Java Program to Implement PriorityBlockingQueue API
Java Program to Permute All Letters of an Input String
Introduction to PCollections
Spring’s RequestBody and ResponseBody Annotations
Java Copy Constructor
Introduction to Java Serialization
Java Program to Perform Uniform Binary Search
How To Serialize and Deserialize Enums with Jackson
Java Web Services – Jersey JAX-RS – REST và sử dụng REST API testing tools với Postman
Java Program to Implement the MD5 Algorithm
Mapping Nested Values with Jackson
Hướng dẫn Java Design Pattern – Abstract Factory
Interface trong Java 8 – Default method và Static method
Tránh lỗi NullPointerException trong Java như thế nào?
Java Program to Implement Booth Algorithm
So sánh HashMap và HashSet trong Java