Java – Khái niệm OOP

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về khái niệm OOP. OOP là viết tắt của Object-Oriented Programming là mô hình cung cấp nhiều khái niệm như là kế thừa, ràng buộc dữ liệu, đa hình…

Object

Bất kỳ thực thể nào mà có trạng thái và các hành vi thì được gọi là object. Ví dụ như bàn, ghế, bút, xe đạp…Nó có thể là vật lý hoặc logic

Một object được định nghĩa như một instance của class. Một object chứa địa chỉ và chiếm một khoảng không gian trong bộ nhớ. Các object có thể giao tiếp mà không cần biết chi tiết về dữ liệu và code của nhau. Điều cần thiết duy nhất là kiểu bản in được chấp nhận và kiểu trả về được trả về bởi object

Ví dụ một con chó là một object bởi vì nó có các trạng thái như là tên, màu, loại.. và có các hành vi như là ăn, sủa, vẫy đuôi

Class

Tập hợp của các object gọi là class. Nó là một thực thể logic.

Một class cũng có thể được định nghĩa như một bản vẽ thiết kế từ đó giúp bạn có thể tạo một object riêng biệt. Class không chiếm bộ nhớ

Khái niệm OOP

Các khái niệm OOP cốt lõi là:

  1. Abstraction (trừu tượng)
  2. Encapsulation (Đóng gói)
  3. Polymorphism (Đa hình)
  4. Inheritance (Kế thừa)
  5. Association (Kết hợp)
  6. Aggregation (Tập hợp)
  7. Composition (Thành phần)

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

Abstraction là khái niệm ẩn các chi tiết nội bộ và mô tả mọi thứ bằng thuật ngữ đơn giản. Ví dụ như là một phương thức dùng để thêm vào 2 số interger. Việc xử lý nội bộ của phương thức được ẩn khỏi bên ngoài. Có rất nhiều cách để thực hiện abstraction trong OOP như là đòng gói và kế thừa.

Một chương trình Java cũng là ví dụ tuyệt vời của abstraction. Ở đây Java sẽ đảm nhiệm việc chuyển đổi các câu lệnh đơn giản sang ngôn ngữ máy và ẩn đi các chi tiết về cách thực hiện với bên ngoài

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

Encapsulation là kỹ thuật được sử dụng để thực thi abstraction trong OOP.

Encapsulation dùng để hạn chế các truy cập đến các phương thức và member của class

Từ khoá Access Modifier được sử dụng để đóng gói trong OOP. Ví dụ đóng gói trong Java được thực hiện bằng cách sử dụng các từ khoá Private, Protected, Public.

Polymorphism (Tính đa hình)

Polymorphism là khái niệm mà các object xử lý khác nhau trong các trường hợp khác nhau. Có 2 kiểu polymorphism: Đa hình thời gian biên dịch và đa hình thời gian chạy.

Đa hình thời gian biên dịch được thực hiện bằng phương thức overloading. Ví dụ chúng ta có class như bên dưới

public class Circle {
  public void draw(){
    System.out.println("Drwaing circle with default color Black and diameter 1 cm.");
  }
	
  public void draw(int diameter){
    System.out.println("Drwaing circle with default color Black and diameter" + diameter + " cm.");
  }
	
  public void draw(int diameter, String color){
    System.out.println("Drwaing circle with color" + color + " and diameter" + diameter + " cm.");
  }
}

Trong ví dụ trên chúng ta có nhiều phương thức draw() nhưng chúng xử lý khác nhau. Đây là một trường hợp của overloading phương thức bởi vì tên của tất cả các phương thức là giống nhau và các tham số là khác nhau. Ở đây trình biên dịch có thể xác định phương thức để gọi trong thời gian biên dịch do đó nó được gọi là đa hình thời gian biên dịch.

Đa hình thời gian chạy được thực hiện khi chúng ta có quan hệ IS-A giữa các object. Các này cũng được gọi là phương thức overloading bởi vì các subclass phải override lại phương thức super class cho đa hình thời gian chạy.

Nếu chúng ta đang hoạt động với super class, class thực hiện thực tế sẽ được quyết định trong thời gian chạy. Trình biên dịch sẽ không thể quyết định được phương thức class sẽ được gọi. Quyết định này được thực hiện trong lúc chạy, vì thế  nó được gọi là đa hình thời gian chạy hay gửi phương thức động

package com.example.test;

public interface Shape {
  public void draw();
}
package com.example.test;

public class Circle implements Shape{
  @Override
  public void draw(){
    System.out.println("Drwaing circle");
  }
}
package com.example.test;

public class Square implements Shape {
  @Override
  public void draw() {
    System.out.println("Drawing Square");
  }
}

Shape là super class và có 2 subclass là CircleSquare. Sau đây là ví dụ về đa hình thời gian chạy

Shape sh = new Circle();
sh.draw();

Shape sh1 = getShape(); //some third party logic to determine shape
sh1.draw();

Trong ví dụ trên, trình biên dịch Java không thể biết class thực hiện thực tế của Shape mà sẽ được sử dụng trong lúc chạy.

Inheritance (Tính kế thừa)

Inheritance là khái niệm OOP trong đó object dựa trên object khác. Inheritance là cơ chế tái sử dụng code. Object đang được kế thừa gọi là super class và object kế thừa super class được gọi là sub class.

Chúng ta sử dụng từ khoá extends trong Java để thực hiện kế thừa. Dưới đây là ví dụ đơn giản về kế thừa trong Java

package com.example.java.examples1;

class SuperClassA {
  public void foo(){
    System.out.println("SuperClassA");
  }	
}

class SubClassB extends SuperClassA{	
  public void bar(){
    System.out.println("SubClassB");
  }
}

public class Test {
  public static void main(String args[]){
    SubClassB a = new SubClassB();
		
    a.foo();
    a.bar();
  }
}

Association (Tính kết hợp)

Associataion là khái niệm OOP để định nghĩa mối quan hệ giữa các object. Association miêu tả tính phức tạp giữa các object. Ví dụ các object Teacher và Student. Có một đến nhiều liên kết giữa một Teacher và nhiều Student. Tương tự một Student có một hoặc nhiều liên kết với các object Teacher. Tuy nhiên cả object Student và Teacher là độc lập với nhau.

Aggregation (Tập hợp)

Aggregation là kiểu đặc biệt của Association. Trong Aggregation, các object có vòng đời riêng nhưng có một quyền sở hữu.  Bất cứ khi nào chúng ta có liên kết HAS-A giữa các object và quyền sở hữu thì nó là trường hợp Aggregation.

Composition (Thành phần)

Composition là trường hợp đặc biệt của Aggregation. Composition là hình thức hạn chế hơn của Aggregation. Khi chứa các object trong liên kết HAS-A thì có thể tồn tại trên chính nó, thì nó là trường hợp của Composition. Ví dụ trong nhà có một phòng. Ở đây thì phòng không thể tồn tại nếu không có nhà.

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

Your email address will not be published.