【刷題】Java面向對象概述

面向過程與面向對象

面向過程(POP)

  • Procedure Oriented Programming,面向過程是一種以過程爲中心的編程思想,分析出解決問題所需的步驟,而後用函數把這些步驟實現,並按順序調用。它是一種基礎的順序的思惟方式,面向對象方法的基礎實現中也包含面向過程思想。

面向對象(OOP)

  • Object Oriented Programming,面向對象是按人們認識客觀世界的系統思惟方式,採用基於對象(實體)的概念創建模型,模擬客觀世界分析、設計、實現軟件的辦法。經過面向對象的理念使計算機軟件系統能與現實世界中的系統一一對應。在軟件開發過程當中,宏觀上,用面向對象來把握事物間複雜的關係,分析系統。微觀上,仍然使用面向過程。」面向對象「是以「對象」爲中心的編程思想。

區別

三大基本特徵:封裝、繼承、多態

  

一、封裝

  • 封裝就是隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別,將抽象獲得的數據和行爲(或功能)相結合,造成一個有機的總體,也就是將數據與操做數據的源代碼進行有機的結合,造成「類」,其中數據和函數都是類的成員。html

  • 封裝的目的是加強安全性和簡化編程,使用者沒必要了解具體的實現細節,而只是要經過外部接口,以特定的訪問權限來使用類的成員。java

  • 面向對象就是使用程序處理事情時以對象爲中心去分析;與面向過程不一樣,面向過程關心處理的邏輯、流程等問題,而不關心事件主體。而面向對象即面向主體,因此咱們在解決問題時應該先進行對象的封裝(對象是封裝類的實例,好比張三是人,人是一個封裝類,張三隻是對象中的一個實例、一個對象)。好比咱們平常生活中的小兔子、小綿羊均可以封裝爲一個類。編程

  • 好比兔子的屬性有兩隻耳朵、四隻腿、一雙眼睛、三瓣嘴等;行爲(功能)有跑、跳、吃素等。
    安全

二、繼承

  • 繼承是面向對象的基本特徵之一,繼承機制容許建立分等級層次的類。繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的實例域和方法,或子類從父類繼承方法,使得子類具備父類相同的行爲。相似下面這個圖:
    編程語言

  • 咱們在上面已經封裝了兔子這個類,其餘動物也同樣能夠進行封裝。在封裝過程當中咱們發現兔子、綿羊這兩個類具備類似的功能或特性如吃草,因此咱們能夠抽取共有特徵和方法造成高一層的類,如這裏的食草動物、食肉動物。繼承之間是子父類的關係。繼承機制能夠很好的描述一個類的生態,也提升了代碼複用率,在Java中的Object類是全部類的超類,常稱做上帝類。模塊化

三、多態

  • 多態同一個行爲具備多個不一樣表現形式或形態的能力。是指一個類實例(對象)的相同方法在不一樣情形有不一樣表現形式。多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用。函數

  • 多態的優勢:工具

      1. 消除類型之間的耦合關係
      1. 可替換性
      1. 可擴充性
      1. 接口性
      1. 靈活性
      1. 簡化性
          
  • 多態存在的三個必要條件:oop

    • 繼承
    • 重寫(子類繼承父類後對父類方法進行從新定義)
    • 父類引用指向子類對象
        
  • 簡言之,多態實際上是在繼承的基礎上的。好比說今天咱們要去動物園參觀動物,那麼你說咱們去參觀兔子、參觀綿羊、參觀獅子、參觀豹子都是對的,但你不能說咱們去參觀汽車。在這個例子中,子類具備多態性:除了使用本身的身份,還能充當父類。設計

五大基本原則

  

一、單一職責原則(SRP)

  一個類應該有且只有一個去改變它的理由,這意味着一個類應該只有一項工做。

  好比在職員類裏,將工程師、銷售人員、銷售經理這些狀況都放在職員類裏考慮,其結果將會很是混亂,在這個假設下,職員類裏的每一個方法都要if else判斷是哪一種狀況,從類結構上來講將會十分臃腫。

二、開放封閉原則(OCP)

  對象或實體應該對擴展開放,對修改封閉。

  更改封閉便是在咱們對模塊進行擴展時,勿需對源有程序代碼和DLL進行修改或從新編譯文件!這個原則對咱們在設計類的時候頗有幫助,堅持這個原則就必須儘可能考慮接口封裝,抽象機制和多態技術!

三、里氏替換原則(LSP)

  在對象 x 爲類型 T 時 q(x) 成立,那麼當 S 是 T 的子類時,對象 y 爲類型 S 時 q(y) 也應成立。(即對父類的調用一樣適用於子類)

四、依賴倒置原則(DIP)

  高層次的模塊不該該依賴於低層次的模塊,他們都應該依賴於抽象。具體實現應該依賴於抽象,而不是抽象依賴於實現。

  能夠這樣理解,上面我舉例子的時候先說了兔子和綿羊,而後才推出食草動物。但若是咱們繼續認識了牛、馬等食草動物,咱們會發現咱們須要不斷調整食草動物的描述,這樣程序會變得僵化,因此咱們不該該讓子類依賴於實體,不該該讓父類模塊依賴於子類模塊。因此咱們須要將食草動物設計爲抽象類,即抽象類或接口。這樣下層只須要實現相應的細節而不會影響父類。

五、接口隔離原則(ISP)

  不該強迫客戶端實現一個它用不上的接口,或是說客戶端不該該被迫依賴它們不使用的方法,使用多個專門的接口比使用單個接口要好的多!

  好比,爲了減小接口的定義,將許多相似的方法都放在一個接口中,最後會發現,維護和實現接口的時候花了太多精力,而接口所定義的操做至關於對客戶端的一種承諾,這種承諾固然是越少越好,越精練越好,過多的承諾帶來的就是你的大量精力和時間去維護!

  這些基本原則須要咱們在使用面向對象編程中慢慢領會、總結。

面向對象常見問題

JAVA爲何是面向對象的,爲何還用int等基礎類型

  • 面向對象的特徵:封裝,繼承,多態。JAVA語言符合這些特徵。

  • 爲何還用int等基礎類型

    • 由於在每一個封裝體裏,基本仍是面向過程的代碼思想,所以仍是須要這些基礎數據類型。

面向對象軟件開發的優勢有哪些?

  • 更符合人們思考習慣的思想,更多體現的是指揮者,指揮對象作事情,與面向過程的執行者區別;
  • 能夠將複雜問題簡單化,保證了較高的開發效率,保證了程序的魯棒性和可維護性。
  • 易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統。
  • 代碼開發模塊化,更易維護和修改。
  • 加強代碼的可靠性和靈活性。
  • 增長代碼的可理解性。

封裝的定義和好處有哪些?

  • 一是用private把類的細節與外界隔離起來,從而實現數據項和方法的隱藏,而要訪問這些數據項和方法惟一的途徑就是經過類自己,類纔有資格調用它所擁有的資源(方法,數據項屬性等等)。第一個好處就是數據的安全性提升了。

  • 二是經過隱藏隔離,只容許外部對類作有限的訪問,開發者能夠自由的改變類的內部實現,而無需修改使用該類的那些程序。只要那些在類外部就能被調用的方法保持其外部特徵不變,內部代碼就能夠自由改變,各取所需,利於分工。提升了代碼的可用性和可維護性

  • 三就是提升了代碼的重用性,封裝成工具類之後可以減小不少繁瑣的步驟。

多態

  • 多態是編程語言給不一樣的底層數據類型作相同的接口展現的一種能力。一個多態類型上的操做能夠應用到其餘類型的值上面。

繼承

  • 繼承給對象提供了從基類獲取字段和方法的能力。繼承提供了代碼的重用性,也能夠在不修改類的狀況下給現存的類添加新特性。

抽象的定義?抽象和封裝的不一樣點?

抽象是把想法從具體的實例中分離出來的步驟,所以,要根據他們的功能而不是實現細節來建立類。Java支持建立只暴漏接口而不包含方法實現的抽象的類。這種抽象技術的主要目的是把類的行爲和實現細節分離開。
抽象和封裝是互補的概念。一方面,抽象關注對象的行爲。另外一方面,封裝關注對象行爲的細節。通常是經過隱藏對象內部狀態信息作到封裝,所以,封裝能夠當作是用來提供抽象的一種策略。

參考連接

END

相關文章
相關標籤/搜索