面向对象程序设计

特徵

物件導向程式程式設計的定義是使用「物件」來做設計，但並非所有的程式語言都直接支援「物件導向程式程式設計」相關技術與結構。對於OOP的準確定義及其本意存在著不少爭論。通常，OOP被理解為一種將程式分解為封裝資料及相關操作的模組而進行的程式設計方式。有別於其它程式設計方式，OOP中的與某資料類別型相關的一系列操作都被有機地封裝到該資料類別型當中，而非散放於其外，因而OOP中的資料類別型不僅有著狀態，還有著相關的行為。
OOP理論，及與之同名的OOP實踐相結合創造出了新的一個程式設計架構；OOP思想被廣泛認為是非常有用的，以致一套新的程式設計範型被創造了出來。（其它的程式設計範型例如函式語言程式設計或程序式程式設計專注於程式執行的過程，而邏輯程式設計專注於引發程式碼執行的斷言）。對面向類比系統的語言（如：SIMULA 67）的研究及對高可靠性系統架構（如：高效能作業系統和CPU的架構）的研究最終導致了OOP的誕生。其中由Deborah J. Armstrong進行的長達40年之久的電腦著作調查中，顯示出了一系列物件導向程式設計的基本理論。物件導向程式特徵被條列如下

動態組態與訊息傳遞機制

定義上動態組態是指方法會隨著實例動態的改變。而訊息傳遞機制（Message Passing）是指一個物件通過接受訊息、處理訊息、傳出訊息或使用其他類別的方法來實作一定功能。如：萊絲可以通過吠叫引起人的注意，從而導致一系列的事發生。

封裝性

具備封裝性（Encapsulation）的物件導向程式設計隱藏了某一方法的具體執行步驟，取而代之的是通過訊息傳遞機制傳送訊息給它。封裝是通過限制只有特定類別的物件可以存取這一特定類別的成員，而它們通常利用介面實作訊息的傳入傳出。舉個例子，介面能確保幼犬這一特徵只能被賦予狗這一類別。通常來說，成員會依它們的存取權限被分為3種：公有成員、私有成員以及保護成員。有些語言更進一步：Java可以限制同一包內不同類別的存取；C#和VB.NET保留了為類別的成員聚集準備的關鍵字：internal（C#）和Friend（VB.NET）；Eiffel語言則可以讓使用者指定哪個類別可以存取所有成員。
具備封裝性（Encapsulation）的物件導向程式設計隱藏了某一方法的具體執行步驟，取而代之的是通過訊息傳遞機制傳送訊息給它。因此，舉例來說，「狗」這個類別有「吠叫()」的方法，這一方法定義了狗具體該通過什麼方法吠叫。但是，萊絲的朋友並不知道它到底是如何吠叫的。
從實體來看：
/* 一個程序導向的程式會這樣寫： */
定義萊絲
萊絲.設定音調(5)
萊絲.吸氣()
萊絲.吐氣()

/* 而當狗的吠叫被封裝到類別中，任何人都可以簡單地使用： */
定義萊絲是狗
萊絲.吠叫()

繼承

繼承性（Inheritance）是指，在某種情況下，一個類別會有「子類別」。子類別比原本的類別（稱為父類別）要更加具體化。例如，「狗」這個類別可能會有它的子類別「牧羊犬」和「吉娃娃犬」。在這種情況下，「萊絲」可能就是牧羊犬的一個實體。子類別會繼承父類別的屬性和行為，並且也可包含它們自己的。我們假設「狗」這個類別有一個方法（行為）叫做「吠叫()」和一個屬性叫做「毛皮顏色」。它的子類別（前例中的牧羊犬和吉娃娃犬）會繼承這些成員。這意味著程式設計師只需要將相同的程式碼寫一次。
在虛擬碼中我們可以這樣寫：
類別牧羊犬 : 繼承狗

定義萊絲是牧羊犬
萊絲.吠叫()    /* 注意這裡呼叫的是狗這個類別的吠叫方法。*/
回到前面的例子，「牧羊犬」這個類別可以繼承「毛皮顏色」這個屬性，並指定其為棕白色。而「吉娃娃犬」則可以繼承「吠叫()」這個方法，並指定它的音調高於平常。子類別也可以加入新的成員，例如，「吉娃娃犬」這個類別可以加入一個方法叫做「顫抖()」。設若用「牧羊犬」這個類別定義了一個實體「萊絲」，那麼萊絲就不會顫抖，因為這個方法是屬于吉娃娃犬的，而非牧羊犬。事實上，我們可以把繼承理解為「是」或「屬於」。萊絲「是」牧羊犬，牧羊犬「屬於」狗類別。因此，萊絲既得到了牧羊犬的屬性，又繼承了狗的屬性。
我們來看虛擬碼：
類別吉娃娃犬 : 繼承狗
開始
    公有成員:
        顫抖()
結束
類別牧羊犬 : 繼承狗

定義萊絲是牧羊犬
萊絲.顫抖()    /* 錯誤：顫抖是吉娃娃犬的成員方法。 */
當一個類別從多個父類別繼承時，我們稱之為「多重繼承」。如一隻狗既是吉娃娃犬又是牧羊犬（雖然事實上並不合邏輯）。多重繼承並不總是被支援的，因為它很難理解，又很難被好好使用。

多型

多型（Polymorphism）是指由繼承而產生的相關的不同的類別，其物件對同一訊息會做出不同的回應。例如，狗和雞都有「叫()」這一方法，但是呼叫狗的「叫()」，狗會吠叫；呼叫雞的「叫()」，雞則會啼叫。
我們將它體現在虛擬碼上：
類別狗
開始
    公有成員:
        叫()
        開始
            吠叫()
        結束
結束

類別雞
開始
    公有成員:
        叫()
        開始
            啼叫()
        結束
結束

定義萊絲是狗
定義魯斯特是雞
萊絲.叫()
魯斯特.叫()
這樣，雖然同樣是做出叫這一種行為，但萊絲和魯斯特具體做出的表現方式將大不相同。多型性的概念可以用在運算子多載上，可以根據需求檢視相關介面。

抽象性

抽象（Abstraction）是簡化複雜的現實問題的途徑，它可以為具體問題找到最恰當的類別定義，並且可以在最恰當的繼承級別解釋問題。舉例說明，萊絲在大多數時候都被當作一條狗，但是如果想要讓它做牧羊犬做的事，你完全可以呼叫牧羊犬的方法。如果狗這個類別還有動物的父類別，那麼你完全可以視萊絲為一個動物。

歷史

物件導向程式設計的雛形，早在1960年的Simula語言中即可發現，當時的程式設計領域正面臨著一種危機：在軟硬體環境逐漸複雜的情況下，軟體如何得到良好的維護？物件導向程式設計在某種程度上通過強調可重複性解決了這一問題。20世紀70年代的Smalltalk語言在物件導向方面堪稱經典——以至於30年後的今天依然將這一語言視為物件導向語言的基礎。
電腦科學中物件和實體概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構（capability based architecture）的實際系統。另外1963年Ivan Sutherland的Sketchpad應用中也蘊含了同樣的思想。物件作為程式設計實體最早是於1960年代由Simula 67語言引入思維。Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸電腦中心為類比環境而設計的。（據說，他們是為了類比船隻而設計的這種語言，並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類別，而每一個物件，基於它的類別，可以定義它自己的屬性和行為。）這種辦法是分析式程式的最早概念體現。在分析式程式中，我們將真實世界的物件對映到抽象的物件，這叫做「類比」。Simula不僅引入了「類別」的概念，還應用了實體這一思想——這可能是這些概念的最早應用。
20世紀70年代全錄PARC研究所發明的Smalltalk語言將物件導向程式設計的概念定義為，在基礎運算中，對物件和訊息的廣泛應用。Smalltalk的建立者深受Simula 67的主要思想影響，但Smalltalk中的物件是完全動態的——它們可以被建立、修改並銷毀，這與Simula中的靜態物件有所區別。此外，Smalltalk還引入了繼承性的思想，它因此一舉超越了不可建立實體的程式設計模型和不具備繼承性的Simula。此外，Simula 67的思想亦被應用在許多不同的語言，如Lisp、Pascal。
物件導向程式設計在80年代成為了一種主導思想，這主要應歸功於C++——C語言的擴充版。在圖形化使用者介面（GUI）日漸崛起的情況下，物件導向程式設計很好地適應了潮流。GUI和物件導向程式設計的緊密關聯在Mac OS X中可見一斑。Mac OS X是由Objective-C語言寫成的，這一語言是一個仿Smalltalk的C語言擴充版。物件導向程式設計的思想也使事件處理式的程式設計更加廣泛被應用（雖然這一概念並非僅存在於物件導向程式設計）。一種說法是，GUI的引入極大地推動了物件導向程式設計的發展。
蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象資料和模組化程式設計進行了研究。Modula-2將這些都包括了進去，而Oberon則包括了一種特殊的物件導向方法——不同於Smalltalk與C++。
物件導向的特性也被加入了當時較為流行的語言：Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有物件導向的設計，故而這種糅合常常會導致相容性和維護性的問題。與之相反的是，「純正的」物件導向語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下，開發新的語言成為了當務之急。作為先行者，Eiffel成功地解決了這些問題，並成為了當時較受歡迎的語言。
在過去的幾年中，Java語言成為了廣為應用的語言，除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步，因為這一特性，已吸引了龐大的程式設計師群的投入。
在最近的電腦語言發展中，一些既支援物件導向程式設計，又支援程序導向程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等。
正如程序導向程式設計使得結構化程式設計的技術得以提升，現代的物件導向程式設計方法使得對設計模式的用途、契約式設計和建模語言（如UML）技術也得到了一定提升。

物件導向程式語言

支援部分或絕大部分物件導向特性的語言即可稱為基於物件的或物件導向的語言。Simula (1967)被視為第一個具有物件導向特性的語言。早期，完全物件導向的語言主要包括Smalltalk等語言，目前較為流行的語言中有Java、C#、Eiffel等。隨著軟體工業的發展，比較早的程序導向的語言在近些年的發展中也紛紛吸收了許多物件導向的概念，比如C→C++，C→Objective-C，BASIC→Visual Basic→Visual Basic .NET，Pascal→Object Pascal，Ada→Ada95。「純粹」的物件導向語言, 因為所有的東西都是由物件所組成，例如：Eiffel, Emerald, JADE, Obix, Ruby, Scala, Smalltalk, Self.

指令碼中的OOP

近年來，物件導向的程式設計越來越流行於手稿語言中。Python和Ruby是建立在OOP原理的指令碼語言，Perl和PHP亦分別在Perl 5和PHP 4時加入物件導向特性。