文章摘要: 類(class)物件 以類為基礎產生新物件沒有繼承就沒有多型). 2. 子類重寫父類的方法(多型下呼叫子類重寫的方法). 3. 父類引用變數指向子類物件(子類到父類的型別轉換). 所以在以上例子中
物件導向程式設計(OOP)的概念
物件導向程式設計技術的關鍵性觀念是它將資料及對資料的操作行為放在一起,作為一個相互依存、不可分割的整體——物件。對於相同型別的物件進行分類、抽象後,得出共同的特徵而形成了類。物件導向程式設計就是定義這些類。類是描述相同型別的物件集合。類定義好之後將作為資料型別用於建立類的物件。程式的執行表現爲一組物件之間的互動通訊。物件之間通過公共介面進行通訊,從而完成系統功能。類中宣告的public成員組成了物件的對外公共介面。簡單來說就是以功能為解決問題的中心。
物件的產生的方式。
原型(prototype)物件
以原型物件為基礎產生新的物件。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的物件為基礎來產生各種新的物件,並由此繼續產生更符合實際應用的物件。而原型-委託也是OOP中的物件抽象,程式碼共享機制中的一種。
類(class)物件
以類為基礎產生新物件。一個類提供了一個或者多個物件的通用性描述。從形式化的觀點看,類與型別有關,因此一個類相當於是從該類中產生的例項的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)物件和父集(父類)物件之間的行為相融性可能很難達到,這也就是OOP中常被引用的—子型別(subtype)不等於子類(subclass)。
有元類(metaclass)的新物件模型
在一種所有皆物件的世界觀背景下,在類模型基礎上還誕生出了一種擁有元類(metaclass)的新物件模型。即類本身也是一種其他類的物件。
以上三種根本不同的觀點各自定義了三種基於類(class-based),基於原型(prototype-based)和基於元類(metaclass-based)的物件模型。而這三種物件模型也就導致了許多不同的程式設計語言。像C++、Java都是使用基於類的物件模型。
OOP的基本思想
oop強調在程式構造中語言要素的語法。使用繼承,使用類,使用物件,物件傳遞訊息。不關心你繼承或是不繼承,它的開端是分析產品的分類,有些什麼種類,他們的行為如何。就是說,兩件東西相等意味著什麼?怎樣正確地定義相等操作?不單單是相等操作那麼簡單,你往深處分析就會發現「相等」這個一般觀念意味著兩個物件部分,或者至少基本部分是相等的,據此我們就可以有一個通用的相等操作。
OOP 特性
三大特性分別是封裝,繼承,多型。
封裝
概念:把物件的屬性和方法結合成一個獨立的整體,隱藏實現細節,並提供對外訪問的介面。
作用:
1. 隱藏實現細節。好比你買了臺電視機,你只需要怎麼使用,並不用瞭解其實現原理。
2. 安全性。比如你在程式中私有化某屬性,並提供了對外的get和set方法,當外界使用set方法為屬性設值的時候,可以在set方法裡限制賦值。
3. 增加程式碼的複用性。好比在工具類中封裝的各種方法,你可以在任意地方重複呼叫,而不用再每處都去實現其細節。
4. 模組化。封裝分為屬性封裝,方法封裝,類封裝,外掛封裝,模組封裝,系統封裝等等。有利於程式的協助分工,互不干擾,方便了模組之間的相互組合與分解,也有利於程式碼的除錯和維護。
繼承
概念:從已知的一個類中派生出新的一個類,叫子類。子類實現了父類所有非私有化屬性和方法,並能根據自己的實際需求擴充套件出新的行為。
作用:
1. 繼承是傳遞的,容易在其基礎上構造,建立和擴充出新的類。
2. 簡化了人們對事物的認識和描述,能清晰體現相關類之間的層次結構關係。
3. 能減少資料和程式碼的冗餘度。
4. 大大增加了程式碼的維護性。
多型
概念:多個不同的物件對同一訊息作出響應,同一訊息根據不同的物件而採用各種不同的行為方法。
作用:主要是利於擴充套件。
例子:
public class MyGarage { public static void main(String[] args){ Benz benz = new Benz("賓士"); VW vw = new VW("大眾"); BMW bmw = new BMW("寶馬"); People p = new People(); p.drive(benz); p.drive(vw); p.drive(bmw); } } class People { public String name; public Car car; public void drive(Car car){ this.car = car; car.run(); } } class Car{ public String name; public Car(String name){ this.name = name; } public void run(){ System.out.println(name + "已放入車庫"); } } class VW extends Car{ public VW(String name){ super(name); } } class Benz extends Car{ public Benz(String name){ super(name); } } class BMW extends Car{ public BMW(String name){ super(name); } }
多型體現在以下幾個方面:
1. 繼承的存在(繼承是多型的基礎,沒有繼承就沒有多型).
2. 子類重寫父類的方法(多型下呼叫子類重寫的方法).
3. 父類引用變數指向子類物件(子類到父類的型別轉換).
所以在以上例子中,主要體現了1和3。
多型的實現方式在此列舉以下:
方式一:重寫(Override)與過載(Overload)
方式二:介面(Interface)
方式三:抽象類和抽象方法。
待續……