如何理解面向對象與面向過程的區別

1.面向對象和面向過程的本質是什麼?

面向對象與面向過程本質來說都是代碼結構的設計或者思想,而編程則是通過編程語言將事物的邏輯根據需求描述出來,所以我覺得並不能說Java就是一種面向對象的語言,而c就是一種面向過程的語言,我的理解是Java內置的語法對面向對象的代碼結構支持比較好。

2.為什麼先出現面向過程後出現面向過程?

現代社會中一個新事物或者新概念的出現往往是伴隨着需求而產生的。

比如我想要去一個很遠的地方,但步行的時間太長,人們無法接受,所以慢慢的單車,摩托車,汽車,飛機等交通工具就被發明和創造出來。

而以編程的發展史為例,一開始的軟件都比較簡單,常常只是執行單一的功能,例如計算加減,所以面向過程的代碼結構已經足以滿足需求。

但隨着人類社會的不斷發展,對計算機的功能要求也不斷提高,需要計算機為我們的生活提供更大的便利,例如幫我們管理一個大公司的運營,從而出現數之不盡的管理系統。

3.應該如何理解

以面向對象的三大特性,繼承,封裝,多態為引子。

假設一個公司有ABCD四個部門,每個部門都有自己的工作內容,例如開會,彙報,總結數據,那麼各個的部門的工作內容都可以定義為

function A_開會  function A_彙報  function A_總結數據  function A_自己的工作

function B_開會  function B_彙報  function B_總結數據  function B_自己的工作

function C_開會  function C_彙報  function C_總結數據  function C_自己的工作

function D_開會  function D_彙報  function D_總結數據  function D_自己的工作

 

如果把它們每個部門歸類,那就變成以下形式

A {
  function 開會
    function 彙報
  function 總結數據
  function 做自己的工作
}

B {
  function 開會
  function 彙報
  function 總結數據
  function 做自己的工作
}

C {
  function 開會
  function 彙報
  function 總結數據
  function 做自己的工作
}

D {
  function 開會
  function 彙報
  function 總結數據
  function 做自己的工作
}

 

這個時候類的概念就呼之欲出了,也是一種抽象的體現,然後我們進一步發現不同部門裡做的很多工作性質都是一樣的,都是開會,只是討論的問題不同,這個時候我們又可以抽象出一個部門類出來

Department {
  function 開會
  function 彙報
  function 總結數據
}

 

而各個部門就去繼承部門類,實現各自具體的工作細節,繼承的概念就體現了,而每一個部門所做的事都封裝在各自類中的方法里,封裝的概念也體現了。

至於多態往往體現在繼承體系中方法的重載,如下代碼所示

class Father {
    void sleep() {
        System.out.println("father is sleeping");
    }
}
class Son extends Father {
    @Override
    void sleep() {
        System.out.println("son is sleeping");
    }
}

public class Test{
    public static void main(String[] args){
        Father son = new Son();
        son.sleep();
    }
}
控制台打印
son is sleeping

 

父類引用指向子類對象,調用方法時會調用子類的實現,而不是父類的實現,也就是說我們可以在代碼運行中根據具體角色去動態的執行相應的方法,

例如訂單模塊中根據選擇的優惠去生成不同的優惠對象進而執行不同的優惠實現

4.總結

面向過程可以理解為根據事物發展的順序串行的執行相應的代碼,正如編年史的製作,將各個事物的發展按照時間的年限逐步講述

面向對象則將將事物抽象化,總結歸類並根據抽象後的規律運行,正如紀傳史,根據一個起點描述出一個宏偉的故事

當然面向對象思想的出現也是因為有了複雜而宏大的系統需求應運而生