4 tính chất của lập trình hướng đối tượng trong Java

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 javatí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:

Spring @RequestMapping New Shortcut Annotations
Spring Boot - Creating Docker Image
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers
Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC
Spring Boot Configuration with Jasypt
OAuth 2.0 Resource Server With Spring Security 5
Java Program to Test Using DFS Whether a Directed Graph is Strongly Connected or Not
Comparing Objects in Java
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
Rest Web service: Filter và Interceptor với Jersey 2.x (P2)
Pagination and Sorting using Spring Data JPA
Convert Time to Milliseconds in Java
Java Program to Implement Sorted Vector
Spring Boot - Enabling HTTPS
Java Program to Implement Interval Tree
Introduction to Project Reactor Bus
Java Program to Implement the Edmond’s Algorithm for Maximum Cardinality Matching
Java Program to Permute All Letters of an Input String
Java String to InputStream
Java Program to Perform Searching Using Self-Organizing Lists
Converting Java Date to OffsetDateTime
Logout in an OAuth Secured Application
Toán tử instanceof trong java
Java Program to Implement vector
Java Program to Construct an Expression Tree for an Prefix Expression
Convert String to int or Integer in Java
Xử lý ngoại lệ đối với trường hợp ghi đè phương thức trong java
So sánh HashSet, LinkedHashSet và TreeSet trong Java
Intro to Inversion of Control and Dependency Injection with Spring
ClassNotFoundException vs NoClassDefFoundError
Spring Data Reactive Repositories with MongoDB
Java Program to Implement Shunting Yard Algorithm

2 Trackbacks / Pingbacks

  1. Các nguyên lý thiết kế hướng đối tượng – SOLID – BLOG CHIA SẺ KIẾN THỨC CỦA VIETMX
  2. Giới thiệu Design Patterns - Blog của VietMX

Comments are closed.