Lập trình hướng đối tượng Java – bạn đã thực sự hiểu rõ? – VNTALKING

Trong bài viết này, mình sẽ nói về các khái niệm lập trình hướng đối tượng trong Java. Bởi vì Java như là một hình mẫu lý tưởng cho triết lý lập trình hướng đối tượng.

Vậy lập trình hướng đối tượng là gì ? Đó chính là một kiểu lập trình với những khái niệm như Lớp ( Class ), Đối tượng ( Object ), Kế thừa ( Inheritance ), tính đóng gói ( Encapsulation ), Trừu tượng ( Abstraction ), Đa hình ( Polymorphism ) gọi tắt là OOP .
Phần lớn những ngôn từ lập trình giống như Java, C + +, C #, Ruby … đều theo quy mô lập trình hướng đối tượng .

Qua bài viết này, chúng ta sẽ hiểu rõ bản chất các khái niệm cốt lõi của lập trình hướng đối tượng Java qua 4 tính chất của lập trình hướng đối tượng

  1. Kế thừa
  2. Đóng gói
  3. Trừu tượng
  4. Đa hình

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Trước hết, tất cả chúng ta sẽ lướt qua lập trình hướng đối tượng là gì đã nhé !

# Lập trình hướng đối tượng là gì ?

Lập trình hướng đối tượng hay còn gọi là lập trình OOP là kỹ thuật lập trình mà tổng thể những logic, nhu yếu thực tiễn đều được kiến thiết xây dựng xoay quanh những đối tượng .
Khi sử dụng OOP, tất cả chúng ta sẽ định nghĩa những class để quy mô hóa những đối tượng trong thực tiễn. Trong ứng dụng những class sẽ được khởi tạo thành những instance. Trong suốt thời hạn ứng dụng chạy, những phương pháp ( method ) của đối tượng này sẽ được gọi .
Trong quốc tế thực, đối tượng là những thực thể sống sót có trạng thái và hành vi .

các phương pháp lập trình hướng đối tượng,

Hướng tiếp cận này hiện đang rất thành công xuất sắc và đã trở thành một trong những khuôn mẫu tăng trưởng ứng dụng, đặc biệt quan trọng là những ứng dụng cho doanh nghiệp .

# Ưu điểm của OOP

Do lập trình hướng đối tượng sinh ra sau này, nên nó thừa kế và khắc phục được những điểm yếu kém của những quy mô lập trình trước đó .
Với 4 đặc thù OOP đặc trưng của mình, hoàn toàn có thể nói lập trình hướng đối tượng rất thích hợp cho những ứng dụng dành cho doanh nghiệp .
Mình hoàn toàn có thể liệt kê một số ít ưu điểm của OOP :

  • Khả năng mở rộng cao.
  • Có khả năng tái sử dụng rất tốt nhờ tính kế thừa.
  • Dễ quản lý code khi cần thêm tính năng.
  • Dễ học, đơn giản, dễ bảo trì…

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

Chúng ta hãy khởi đầu với khái niệm tiên phong của lập trình hướng đối tượng : Tính thừa kế

1. Tính thừa kế

Trong lập trình hướng đối tượng, những chương trình máy tính được phong cách thiết kế theo nguyên tắc là tổng thể mọi thứ đều được xem là đối tượng và tương tác với những đối tượng khác .
Tính thừa kế là một khái niệm được hiểu những thuộc tính của một lớp hoàn toàn có thể được thừa kế bởi một lớp khác. Nó giúp tất cả chúng ta hoàn toàn có thể sử dụng lại code và thiết lập một mối quan hệ giữa những class khác nhau .

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Như tất cả chúng ta thấy ở hình trên, một đứa trẻ thừa kế những thuộc tính của cha cậu ấy. Tương tự, trong Java, tất cả chúng ta sẽ có 2 class như bên dưới :

  • Lớp cha còn được hiểu là Lớp siêu cấp, Lớp cơ sở (Parent class hoặc Super class hay Base class)
  • Lớp con còn được hiểu Lớp phụ, Lớp dẫn xuất (Child class hoặc Sub class hoặc Derived class)

Một lớp kế thừa những thuộc tính được biết đến là một Sub class trong khi một lớp có các thuộc tính được kế thừa được gọi là Parent class.

Kế thừa được phân loại làm 4 loại :

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Chúng ta hãy mở màn với loại tiên phong của thừa kế : Đơn thừa kế ( Single Inheritance )

1.1 Đơn thừa kế ( Single Inheritance )

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Đối với Đơn thừa kế, một lớp sẽ thừa kế những thuộc tính của một lớp khác. Nó được cho phép một lớp con thừa kế những thuộc tính và hành vi ( method ) từ một lớp cha .
Điều này sẽ được cho phép code năng lực tái sử dụng code cũng như thêm những tính năng mới vào những đoạn code hiện có .
Ở ví dụ bên dưới, Class A là lớp cha và Class B là lớp con với những thuộc tính và hành vi của lớp cha .

Trong java thì để kế thừa, đơn giản là sử dụng từ khóa extend

Class A
{
---
}
Class B extends A {
---
}
  • Dành cho bạn: Top 5 ngôn ngữ để phát triển ứng dụng Android

1.2. Kế thừa kiểu Đa cấp ( Multilevel Inheritance )

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Khi một lớp được bắt nguồn từ một lớp mà cũng là lớp con ( thừa kế từ một lớp khác ). Tức là một lớp có nhiều hơn một cấp cha, kiểu thừa kế đó được gọi là thừa kế kiểu Đa cấp .
Hãy xem sơ đồ, Class B thừa kế những thuộc tính và hành vi của class A, và class C thừa kế những thuộc tính, hành vi của Class B. Ở đây, Class A là lớp cha của Class B và Class B là lớp cha của Class C .
Trong trường hợp này, Class C ngầm thừa kế những thuộc tính và hành vi của Class A trải qua Class B. Đó chính là thừa kế kiểu Đa cấp
Cách viết thừa kế kiểu đa cấp trong java cũng tương tự như như đơn thừa kế

Class A{
---
}
Class B extends A{
---
}
Class C extends B{
---
}

1.3. Kế thừa thứ bậc ( Hierarchical Inheritance )

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Khi một lớp có nhiều hơn một lớp con hoặc nói cách khác là có nhiều hơn một lớp con có cùng chung một lớp cha, lúc này loại kế thừa này được gọi là thứ bậc (hierarchical).

Hãy xem sơ đồ bên trên, Class B and Class C là lớp con đang thừa kế chung lớp cha là Class A .
Cùng xem cấu trúng kế thừa thứ bậc trong Java

Class A{
---
}
Class B extends A{
---
}
Class C extends A{
---
}

1.4. Kế thừa lai ( Hybrid Inheritance )

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Kế thừa lai là sự tích hợp của nhiều loại thừa kế và nhiều cấp thừa kế. Vì đa thừa kế không được tương hỗ trong Java chính bới nó dẫn đến sự mơ hồ, nên loại thừa kế này chỉ hoàn toàn có thể triển khai được trải qua Interface

Hãy xem sơ đồ trên, Class A là lớp cha của Class B và Class C. Trong khi Class B và Class C đều là lớp cha của Class D

Như vậy, bạn đã hiểu rõ về thừa kế trong lập trình hướng đối tượng rồi đúng không ? Hãy cùng chuyển sang một dạng khái niệm lập trình hướng đối tượng khác đó là tính đóng gói ( Encapsulation )

  • Đừng bỏ lỡ: Tuyệt chiêu tối ưu code Java khi lập trình Android

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

Tính đóng gói là một chính sách link tài liệu và code chung với nhau thành một đơn vị chức năng duy nhất. Nó cũng được hiểu với mục tiêu che giấu tài liệu của bạn để bảo vệ toàn vẹn tài liệu từ những chỉnh sửa bên ngoài .
Điều này có nghĩa là gì ?
Cách tốt nhất để hiểu tính đóng gói là nhìn vào viên nang y tế bên dưới. Ở đây, thuốc luôn được bảo đảm an toàn bên trong viên nang .
Tương tự, trải qua việc đóng gói, những phương pháp và biến của một lớp cũng được ẩn và bảo đảm an toàn .

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Chúng ta thực thi tính đóng gói trong Java bằng cách :

  • Định nghĩa các biến của lớp với phạm vi là private.
  • Chỉ cho phép truy cập vào các thuộc tính/biến của đối tượng thông qua hàm getter, setter.

Hãy xem đoạn code bên dưới để hiểu rõ hơn về tính đóng gói :

public class Employee {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
       this.name = name;
    }

    public static void main(String[] args) {
               // todo
    }
}

Mình đã tạo một Class Employee với biến name có phạm vi là private. Sau đó mình đã tạo các phương thức getter và setter. Thông qua đó, chúng ta có thể lấy và gán giá trị cho cho tên của một Employee.

Thông qua các phương thức này, bất kỳ lớp nào muốn truy xuất biến name đều phải sử dụng các phương thức getter và setter mà không thể được phép truy cập trực tiếp vào thuộc tính name

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

Tính trừu tượng hướng đến chất lượng của những ý tưởng sáng tạo hơn là những sự kiện. Về cơ bản, tính trừu tượng đề cập đến việc ẩn hay hiện những chi tiết cụ thể thiết yếu cho người dùng .
Hãy tưởng tượng rằng tất cả chúng ta có một cuộc gọi, tất cả chúng ta chỉ hoàn toàn có thể lựa chọn nhấc máy hoặc khước từ cuộc gọi. Nhưng trong thực tiễn, có rất nhiều code chạy ngầm bên dưới. Nên bạn không hề biết được quy trình giải quyết và xử lý cuộc gọi, đó chính là ưu điểm của tính trừu tượng .
Do đó, tính trừu tượng giúp tất cả chúng ta giảm sự phức tạp. Có hai cách thực thi tính trừu tượng như bên dưới :

  • Lớp trừu tượng (Abstract Class)
  • Giao diện (Interface)

Lớp trừu tượng (Abstract class)

Lớp trừu tượng trong java chứa từ khóa “abstract”.

Từ khóa abstract là gì? Nếu một lớp được định nghĩa là trừu tượng nó không thể được khởi tạo bằng toán từ “new“, có nghĩa là bạn không thể tạo instance từ một lớp trừu tượng. Ngoài ra, một lớp trừu tượng có thể chứa phương thức trừu tượng hoặc các phương thức bình thường.

Để sử dụng lớp trừu tượng, bắt buộc nó phải được một lớp khác thừa kế và override toàn hàng loạt abstract method .

Giao diện (Interface)

Một Interface trong Java là một tập hợp những phương pháp trừu tượng ( abstract ). Một class tiến hành một interface, do đó thừa kế những phương pháp abstract của interface .
Một interface không phải là một lớp. Viết một interface giống như viết một lớp, nhưng chúng có 2 định nghĩa khác nhau. Một lớp diễn đạt những thuộc tính và hành vi của một đối tượng. Một interface chứa những hành vi mà một class tiến hành .
Cùng nhau khám phá kỹ hơn về Interface bằng ví dụ ‘ ParentCar ’ và những phương pháp tương quan

public interface ParentCar {
    // Thay đổi số
    public void changeGear( int newValue);
    // tăng tốc
    public void speedUp(int increment);
    // Phanh
    public void applyBrakes(int decrement);
}

Mọi chiếc oto đều có những hàng vi này phải không ? Nhưng mỗi loại xe đơn cử lại thực thi khác nhau
Giả sử bạn đang thao tác với xe hơi số sàn, ở đó bạn phải tăng từng số từng cấp một. Nhưng nếu bạn đang thao tác với một chiếc xe tự động hóa, thì mạng lưới hệ thống của bạn sẽ quyết định hành động cách đổi khác số dựa trên đến vận tốc .
Do đó, không phải toàn bộ những lớp con của mình đều có cùng một logic được viết cho việc biến hóa số .
Tương tự với trường hợp tăng cường. Giả sử bạn nhấn ga, vận tốc tăng lên10 km hoặc 15 km. Nhưng giả sử một ai đó đang lái một chiếc siêu xe và nhấn ga, vận tốc tăng 30 kms hoặc 50 kms là chắc. Một lần nữa logic biến hóa
Giống như nhấn phanh, một người hoàn toàn có thể có một mạng lưới hệ thống phanh can đảm và mạnh mẽ hoặc không .
Vì toàn bộ những công dụng đều là common với tổng thể những lớp con, nên mình đã tạo interface ‘ ParentCar ’ có tất những công dụng mà một ôtô đều phải có. Sau đó, từng loại class ôtô đơn cử sẽ phải thực thi những hành vi này

public class Audi implements ParentCar {
    int speed = 0;
    int gear = 1;
    public void changeGear(int value) {
        gear = value;
    }
    public void speedUp(int increment) {
        speed = speed + increment;
    }
    public void applyBrakes(int decrement) {
        speed = speed - decrement;
    }
    void printStates() {
        System.out.println("speed:" + speed + "gear:" + gear);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Audi A6 = new Audi();
        A6.speedUp(50);
        A6.printStates();
        A6.changeGear(4);
        A6.SpeedUp(100);
        A6.printStates();
    }
}

4. Tính đa hình ( Polymorphism )

Đa hình có nghĩa là nhiều hình thức, trong đó ‘ poly ’ có nghĩa là nhiều, còn ‘ morph ’ có nghĩa là hình thức. Đa hình hoàn toàn có thể là một biến, một tính năng hoặc một đối tượng được đưa vào nhiều hình thức .
Nói cách khác, đa hình được cho phép bạn định nghĩa một giao diện hoặc một công dụng với nhiều cách setup .
Để hiểu hơn về đa hình, mình lấy ví dụ như thế này

Lập trình hướng đối tượng Java - bạn đã thực sự hiểu rõ?

Cùng xem xét ngữ cảnh quốc tế thực này trong môn cricket, tất cả chúng ta đều biết rằng có 1 số ít loại người ném banh khác nhau ( bowler ), ví dụ bowlers nhanh, bowler vận tốc trung bình và xoay .

Như bạn thấy ở hình bên trên, lớp cha BowlerClass có 3 lớp con là FastPacer, MediumPacerSpinner.

Lớp Bower có phương thức bowlingMethod() nơi tất cả các lớp con đều kế thừa phương thức này. Như chúng ta biết, tốc độ một trái banh bánh sẽ khác so với ném trung bình và ném banh xoáy cũng như trong cách chơi và kinh nghiệm của người ném banh,..v.v..

Tương tự như vậy, việc thực hiện bowling của phương thức bowlingMethod() cũng sẽ khác so với những bowler khác. Và cũng tương tự với class spinner.

Điểm chính ở thảo luận trên đơn giản là cùng một tên nhưng có nhiều xử lý khác nhau. Tất cả 3 lớp ở trên đều kế thừa phương thức bowlingMethod() nhưng cách thực hiện của từng lớp là hoàn toàn khác nhau

>>> Tài liệu cho bạn về thuật toán lập trình

Kết luận

Như vậy là mình đã trình diễn xong những kiến thức và kỹ năng cơ bản nhất để bạn hiểu về lập trình hướng đối tượng Java .

Hi vọng, qua bài viết này bạn sẽ có cái nhìn toàn diện về lập trình java cũng như lập trình hướng đối tượng. Từ đó dễ dàng tiếp cận thế giới lập trình bao la.

Đừng quên like và san sẻ bài viết nếu thấy có ích nhé .
Chờ chút, nếu bạn muốn học lập trình Java ngay giờ đây và cần tìm một lời khuyên thì của bạn đây : Học lập trình java ở đâu tốt nhất ? Có cần phải đến TT học lập trình ?