成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

第3章:抽象數(shù)據(jù)類型(ADT)和面向?qū)ο缶幊蹋∣OP) 3.4面向?qū)ο缶幊蹋∣OP)

Heier / 2413人閱讀

摘要:抽象數(shù)據(jù)類型的多個不同表示可以共存于同一個程序中,作為實現(xiàn)接口的不同類。封裝和信息隱藏信息隱藏將精心設(shè)計的模塊與不好的模塊區(qū)分開來的唯一最重要的因素是其隱藏內(nèi)部數(shù)據(jù)和其他模塊的其他實施細節(jié)的程度。

大綱

面向?qū)ο蟮臉藴?br>基本概念:對象,類,屬性,方法和接口
OOP的獨特功能

封裝和信息隱藏
繼承和重寫
多態(tài)性,子類型和重載
靜態(tài)與動態(tài)分派

Java中一些重要的Object方法
設(shè)計好的類
面向?qū)ο蟮臍v史
總結(jié)

面向?qū)ο蟮臉藴?/b>

面向?qū)ο蟮木幊谭椒?語言應(yīng)該具有類的概念作為中心概念。
語言應(yīng)該能夠為類和它的特征提供斷言(即規(guī)范:前置條件,后置條件和不變量)和異常處理,依靠工具生成這些斷言中的文檔,并且可選地在運行時監(jiān)視它們 時間。

他們幫助生產(chǎn)可靠的軟件;

他們提供系統(tǒng)文件;

它們是測試和調(diào)試面向?qū)ο筌浖暮诵墓ぞ摺?/p>

靜態(tài)類型:一個定義良好的類型系統(tǒng)應(yīng)該通過強制執(zhí)行一些類型聲明和兼容性規(guī)則來保證它接受的系統(tǒng)的運行時類型安全。

泛型(Genericity):用于“準備改變”和“為/重用設(shè)計”:應(yīng)該可以編寫具有表示任意類型的正式泛型參數(shù)的類。

繼承(Inheritance):應(yīng)該可以將一個類定義為從另一個繼承,以控制潛在的復(fù)雜性。

多態(tài)(Polymorphism):在基于繼承的類型系統(tǒng)的控制下,應(yīng)該可以將實體(表示運行時對象的軟件文本中的名稱)附加到各種可能類型的運行時對象。

動態(tài)分派/綁定(Dynamic dispatch / binding):在一個實體上調(diào)用一個特性應(yīng)該總是觸發(fā)與所附加的運行時對象的類型相對應(yīng)的特性,這在調(diào)用的不同執(zhí)行過程中不一定是相同的。

基本概念:對象,類,屬性和方法

對象

真實世界的物體有兩個特征:它們都有狀態(tài)和行為。
識別真實世界對象的狀態(tài)和行為是從OOP角度開始思考的好方法。

狗有狀態(tài)(名稱,顏色,品種,饑餓)和行為(吠叫,取出,搖尾巴)。

自行車具有狀態(tài)(當(dāng)前檔位,當(dāng)前踏板節(jié)奏,當(dāng)前速度)和行為(更換檔位,改變踏板節(jié)奏,應(yīng)用制動器)。

對于你看到的每個對象,問自己兩個問題,這些現(xiàn)實世界的觀察都轉(zhuǎn)化為OOP的世界:

這個物體有什么可能的狀態(tài)?

這個對象有什么可能的行為?

一個對象是一組狀態(tài)和行為

狀態(tài) - 包含在對象中的數(shù)據(jù)。

在Java中,這些是對象的字段

行為 - 對象支持的操作

在Java中,這些被稱為方法

方法只是面向?qū)ο蟮墓δ?/p>

調(diào)用一個方法=調(diào)用一個函數(shù)

每個對象都有一個類

一個類定義方法和字段

統(tǒng)稱為成員的方法和領(lǐng)域

類定義了類型和實現(xiàn)

類型≈可以使用對象的位置

執(zhí)行≈對象如何做事情

松散地說,類的方法是它的應(yīng)用程序編程接口(API)

定義用戶如何與實例進行交互

靜態(tài)與實例變量/類的方法

類成員變量:與類相關(guān)聯(lián)的變量,而不是類的實例。 您還可以將方法與類關(guān)聯(lián) - 類方法。

要引用類變量和方法,需要將類的名稱和類方法或類變量的名稱連同句點(".")一起加入。

不是類方法或類變量的方法和變量稱為實例方法和實例成員變量。

要引用實例方法和變量,必須引用類實例中的方法和變量

總結(jié):

類變量和類方法與類相關(guān)聯(lián),并且每個類都會出現(xiàn)一次。 使用它們不需要創(chuàng)建對象。

實例方法和變量在類的每個實例中出現(xiàn)一次。

靜態(tài)方法不與任何特定的類實例關(guān)聯(lián),而實例方法(不帶static關(guān)鍵字聲明)必須在特定對象上調(diào)用。

接口

Java的接口是一種用于設(shè)計和表達ADT的有用語言機制,其實現(xiàn)方式是實現(xiàn)該接口的類。

Java中的接口是方法簽名的列表,但沒有方法體。

如果一個類在其implements子句中聲明接口并為所有接口的方法提供方法體,則該類將實現(xiàn)一個接口。

一個接口可以擴展一個或多個其他接口

一個類可以實現(xiàn)多個接口

接口和類:定義和實現(xiàn)ADT

接口之間可以繼承

一個類可以實現(xiàn)多個接口

接口和實現(xiàn)

API的多個實現(xiàn)可以共存

多個類可以實現(xiàn)相同的API

他們在性能和行為方面可能有所不同

在Java中,API由接口或類指定

接口只提供一個API

一個接口定義但不實現(xiàn)API

類提供了一個API和一個實現(xiàn)

一個類可以實現(xiàn)多個接口

一個接口可以有多種實現(xiàn)

Java接口和類

接口與類

接口:確定ADT規(guī)約

類:實現(xiàn)ADT

類確實定義了類型

類似接口方法的公共類方法

可從其他課程直接訪問的公共字段

但更喜歡使用接口

除非你知道一個實現(xiàn)就足夠,否則使用變量和參數(shù)的接口類型。

支持更改實施;

防止依賴于實施細節(jié)

問題:打破抽象邊界

客戶必須知道具體表示類的名稱。

因為Java中的接口不能包含構(gòu)造函數(shù),所以它們必須直接調(diào)用其中一個具體類的構(gòu)造函數(shù)。

構(gòu)造函數(shù)的規(guī)范不會出現(xiàn)在接口的任何位置,所以沒有任何靜態(tài)的保證,即使不同的實現(xiàn)甚至?xí)峁┫嗤臉?gòu)造函數(shù)。

接口的優(yōu)點

接口指定了客戶端的契約,僅此而已。

接口是客戶程序員需要閱讀才能理解ADT的全部內(nèi)容。

客戶端不能在ADT的表示上創(chuàng)建無意的依賴關(guān)系,因為實例變量根本無法放入接口。

實現(xiàn)完全保持完全分離,完全不同。 抽象數(shù)據(jù)類型的多個不同表示可以共存于同一個程序中,作為實現(xiàn)接口的不同類。

當(dāng)一個抽象數(shù)據(jù)類型被表示為一個多帶帶的類時,如果沒有接口,就很難擁有多個表示。

為什么有多個實現(xiàn)

不同的表現(xiàn)

選擇最適合您使用的實現(xiàn)

不同的行為

選擇你想要的實現(xiàn)

行為必須符合接口規(guī)范(“契約”)

性能和行為往往不盡相同

提供功能

性能權(quán)衡

示例:HashSet,TreeSet

接口總結(jié)

編譯器和人員的文檔

允許性能權(quán)衡

可選的方法

有意識欠定規(guī)格的方法

一個類的多個視圖

越來越不值得信賴的實現(xiàn)

減少錯誤保證安全

ADT由它的操作定義,而接口就是這樣做的。

當(dāng)客戶端使用接口類型時,靜態(tài)檢查確保它們只使用接口定義的方法。

如果實現(xiàn)類暴露其他方法 - 或更糟糕的是,具有可見的表示 - 客戶端不會意外地看到或依賴它們。

當(dāng)我們有一個數(shù)據(jù)類型的多個實現(xiàn)時,接口提供方法簽名的靜態(tài)檢查。

容易明白

客戶和維護人員確切知道在哪里查找ADT的規(guī)范。

由于接口不包含實例字段或?qū)嵗椒ǖ膶崿F(xiàn),因此更容易將實現(xiàn)的細節(jié)保留在規(guī)范之外。

準備好改變

我們可以通過添加實現(xiàn)接口的類輕松地添加新類型的實現(xiàn)。

如果我們避免使用靜態(tài)工廠方法的構(gòu)造函數(shù),客戶端將只能看到該接口。

這意味著我們可以切換客戶端正在使用的實現(xiàn)類,而無需更改其代碼。

封裝和信息隱藏

信息隱藏

將精心設(shè)計的模塊與不好的模塊區(qū)分開來的唯一最重要的因素是其隱藏內(nèi)部數(shù)據(jù)和其他模塊的其他實施細節(jié)的程度。
設(shè)計良好的代碼隱藏了所有的實現(xiàn)細節(jié)

將API與實施完全分開

模塊只通過API進行通信

對彼此的內(nèi)在運作無知

被稱為信息隱藏或封裝,是軟件設(shè)計的基本原則。

信息隱藏的好處

將構(gòu)成系統(tǒng)的類分開

允許它們獨立開發(fā),測試,優(yōu)化,使用,理解和修改

加速系統(tǒng)開發(fā)

類可以并行開發(fā)

減輕了維護的負擔(dān)

可以更快速地理解類并調(diào)試,而不必害怕?lián)p害其他模塊

啟用有效的性能調(diào)整

“熱”類可以多帶帶優(yōu)化

增加軟件重用

松散耦合的類通常在其他情況下證明是有用的

通過接口隱藏信息

使用接口類型聲明變量
客戶端只能使用接口方法
客戶端代碼無法訪問的字段
但我們到目前為止

客戶端可以直接訪問非接口成員

實質(zhì)上,它是自愿的信息隱藏

成員的可見性修飾符

private - 只能從聲明類訪問
protected - 可以從聲明類的子類(以及包內(nèi))
public - 從任何地方訪問

信息隱藏的最佳實踐

仔細設(shè)計你的API
只提供客戶需要的功能,其他所有成員應(yīng)該是私人的
您可以隨時在不破壞客戶的情況下讓私人成員公開

但反之亦然!

繼承和重寫

(1)重寫

可重寫的方法和嚴格的繼承
可重寫方法:允許重新實現(xiàn)的方法。

在Java方法中默認是可重寫的,即沒有特殊的關(guān)鍵字。

嚴格的繼承

子類只能向超類添加新的方法,它不能覆蓋它們

如果某個方法不能在Java程序中被覆蓋,則必須以關(guān)鍵字final為前綴。

final

final字段:防止初始化后重新分配給字段
final方法:防止重寫該方法
final類:阻止繼承類

重寫

方法重寫是一種語言功能,它允許子類或子類提供已由其超類或父類之一提供的方法的特定實現(xiàn)。

相同的名稱,相同的參數(shù)或簽名,以及相同的返回類型。

執(zhí)行的方法的版本將由用于調(diào)用它的對象決定。實際執(zhí)行時調(diào)用哪個方法,運行時決定。

如果父類的對象用于調(diào)用該方法,則會執(zhí)行父類中的版本;

如果使用子類的對象來調(diào)用該方法,則會執(zhí)行子類中的版本。

當(dāng)子類包含一個覆蓋超類方法的方法時,它也可以使用關(guān)鍵字super調(diào)用超類方法。
重寫的時候,不要改變原方法的本意

(2)抽象類

抽象方法和抽象類

抽象方法:

具有簽名但沒有實現(xiàn)的方法(也稱為抽象操作)

由關(guān)鍵字abstract定義

抽象類:

一個包含至少一個抽象方法的類被稱為抽象類

接口:只有抽象方法的抽象類

接口主要用于系統(tǒng)或子系統(tǒng)的規(guī)范。 該實現(xiàn)由子類或其他機制提供。

具體類?抽象類?接口

多態(tài)性,子類型和重載

(1)三種多態(tài)性

特殊多態(tài)(Ad hoc polymorphism):當(dāng)一個函數(shù)表示不同且可能不同種類的實現(xiàn)時,取決于多帶帶指定類型和組合的有限范圍。 使用函數(shù)重載(function overloading)在許多語言中支持特設(shè)多態(tài)。
參數(shù)化多態(tài)(parametric polymorphism):當(dāng)代碼被寫入時沒有提及任何特定類型,因此可以透明地使用任何數(shù)量的新類型。 在面向?qū)ο蟮木幊躺鐓^(qū)中,這通常被稱為泛型或泛型編程。
子類型多態(tài)(也稱為子類型多態(tài)或包含多態(tài)):當(dāng)名稱表示由一些公共超類相關(guān)的許多不同類的實例。

(2)特殊多態(tài)和重載

當(dāng)函數(shù)適用于幾種不同的類型(可能不會顯示公共結(jié)構(gòu))并且可能以不相關(guān)的方式表現(xiàn)每種類型時,可以獲得特殊多態(tài)。

(3)重載

重載的方法允許您在類中重復(fù)使用相同的方法名稱,但使用不同的參數(shù)(以及可選的不同的返回類型)。
重載方法通常意味著對于那些調(diào)用方法的人來說會更好一些,因為代碼承擔(dān)了應(yīng)對不同參數(shù)類型的負擔(dān),而不是在調(diào)用方法之前強制調(diào)用方執(zhí)行轉(zhuǎn)換。

函數(shù)重載可以在不同的實現(xiàn)中創(chuàng)建同名的多個方法。

對重載函數(shù)的調(diào)用將運行適合于調(diào)用上下文的該函數(shù)的特定實現(xiàn),允許一個函數(shù)調(diào)用根據(jù)上下文執(zhí)行不同的任務(wù)。

重載是一種靜態(tài)多態(tài)

函數(shù)調(diào)用使用“最佳匹配技術(shù)”解決,即根據(jù)參數(shù)列表解析函數(shù)。

函數(shù)調(diào)用中的靜態(tài)類型檢查

在編譯時確定使用這些方法中的哪一個。(靜態(tài)類型檢查)

與之相反,重寫方法則是在運行時進行動態(tài)檢查!

重載規(guī)則

函數(shù)重載中的規(guī)則:重載函數(shù)必須因參數(shù)或數(shù)據(jù)類型而有所不同

必須改變參數(shù)列表。

可以改變返回類型。

可以改變訪問修飾符。

可以聲明新的或更廣泛的檢查異常。

一個方法可以在同一個類或子類中重載。

重寫與重載

不要混淆覆蓋派生類中的方法和重載方法名稱

當(dāng)方法被覆蓋時,派生類中給出的新方法定義與基類中的參數(shù)數(shù)量和類型完全相同

當(dāng)派生類中的方法與基類中的方法有不同的簽名時,即重載

請注意,當(dāng)派生類重載原始方法時,它仍然繼承基類中的原始方法

(3)參數(shù)多態(tài)性和泛型編程

當(dāng)一個函數(shù)在一系列類型上統(tǒng)一工作時獲得參數(shù)多態(tài)性; 這些類型通常具有一些共同的結(jié)構(gòu)。

它能夠以通用的方式定義函數(shù)和類型,以便它可以在運行時傳遞參數(shù)的基礎(chǔ)上工作,即允許在沒有完全指定類型的情況下進行靜態(tài)類型檢查。

這是Java中所謂的“泛型(Generic)”。

泛型編程是一種編程風(fēng)格,其中數(shù)據(jù)類型和函數(shù)是根據(jù)待指定的類型編寫的,隨后在需要時作為參數(shù)提供的特定類型實例化。

泛型編程圍繞從具體,高效的算法中抽象出來以獲得可與不同數(shù)據(jù)表示形式結(jié)合的泛型算法來生成各種各樣有用軟件的想法相關(guān)。

Java中的泛型

類型變量是一個不合格的標識符。

它們由泛型類聲明,泛型接口聲明,泛型方法聲明和泛型構(gòu)造函數(shù)聲明引入。

如果一個類聲明一個或多個類型變量,則該類是通用的。

泛型類:其定義中包含了類型變量

這些類型的變量被稱為類的類型參數(shù)。

它定義了一個或多個作為參數(shù)的類型變量。

泛型類聲明定義了一組參數(shù)化類型,每個類型參數(shù)部分的每個可能的調(diào)用都有一個類型聲明。

所有這些參數(shù)化類型在運行時共享相同的類。

如果聲明了類型變量,則interface是通用的。

這些類型變量被稱為接口的類型參數(shù)。

它定義了一個或多個作為參數(shù)的類型變量。

通用接口聲明定義了一組類型,每種類型參數(shù)部分的每個可能的調(diào)用都有一個類型。

所有參數(shù)化類型在運行時共享相同的接口。

如果聲明類型變量,則方法是通用的。

這些類型的變量被稱為方法的形式類型參數(shù)。

形式類型參數(shù)列表的形式與類或接口的類型參數(shù)列表相同。

類型變量

使用菱形運算符<>來幫助聲明類型變量。

一些Java泛型細節(jié)

可以有多個類型參數(shù)

例如Map ,Map

Wildcards通配符,只在使用泛型的時候出現(xiàn),不能在定義中出現(xiàn)

List <?> list = new ArrayList ();

List

List

通用類型信息被擦除(即僅編譯時)

不能使用instanceof()來檢查通用類型運行時泛型消失了!

無法創(chuàng)建通用數(shù)組

Pair [] foo = new Pair [42]; //不會編譯

(4)子類多態(tài)性

子類

一個類型是一組值。

Java List類型由接口定義。

如果我們考慮所有可能的List值,它們都不是List對象:我們不能創(chuàng)建接口的實例。

相反,這些值都是ArrayList對象或LinkedList對象,或者是實現(xiàn)List的另一個類的對象。
子類型只是超類型的一個子集

ArrayList和LinkedList是List的子類型。

繼承/子類型的好處:重用代碼,建模靈活性
在Java中:每個類只能直接繼承一個父類; 一個類可以實現(xiàn)多個接口。

“B是A的子類型”意思是“每個B都是A.”
在規(guī)格方面:“每個B都符合A的規(guī)格”。

如果B的規(guī)格至少和A的規(guī)格一樣強,B只是A的一個子類型。 - 當(dāng)我們聲明一個實現(xiàn)接口的類時,Java編譯器會自動執(zhí)行這個需求的一部分:它確保A中的每個方法出現(xiàn)在B中,并帶有一個兼容的類型簽名。

B類不能實現(xiàn)接口A,而不實現(xiàn)A中聲明的所有方法。

靜態(tài)檢查子類型

但編譯器無法檢查我們是否以其他方式削弱了規(guī)范:

加強對某種方法的某些投入的先決條件

弱化后置條件

弱化接口抽象類型通告客戶端的保證。

如果你在Java中聲明了一個子類型(例如,實現(xiàn)一個接口),那么你必須確保子類型的規(guī)范至少和超類型一樣強。
子類型的規(guī)約不能弱化超類型的規(guī)約。

子類型多態(tài)

子類型多態(tài):不同類型的對象可以被客戶代碼統(tǒng)一處理子類型多態(tài):不同類型的對象可以統(tǒng)一的處理而無需區(qū)分
每個對象根據(jù)其類型行為(例如,如果添加新類型的帳戶,客戶端代碼不會更改)從而隔離了“變化”

Liskov替換原則(LSP):

如果S是T的子類型,那么類型T的對象可以用類型S的對象替換(即,類型T的對象可以用子類型S的任何對象代替)而不改變T的任何期望屬性。

instanceof

測試某個對象是否為給定類的運算符
建議:如果可能,避免使用instanceof(),并且從不在超類中使用instanceof()來檢查針對子類的類型。

類型轉(zhuǎn)換

有時你想要一種不同于你已有的類型
如果你知道你有一個更具體的子類型,很有用
但是如果類型不兼容,它會得到一個ClassCastException

建議:

避免向下轉(zhuǎn)換類型

從不在超類內(nèi)向某個子類下降

動態(tài)分派

動態(tài)分派是選擇在運行時調(diào)用多態(tài)操作的哪個實現(xiàn)的過程。

面向?qū)ο蟮南到y(tǒng)將一個問題建模為一組交互對象,這些對象執(zhí)行按名稱引用的操作。

多態(tài)現(xiàn)象是這樣一種現(xiàn)象,即有些可互換的對象每個都暴露同一名稱的操作,但行為可能不同。

確定在運行時要調(diào)用哪種方法,即對重寫或多態(tài)方法的調(diào)用可在運行時解決

作為示例,F(xiàn)ile對象和Database對象都有一個StoreRecord方法,可用于將人員記錄寫入存儲。 他們的實現(xiàn)不同。

一個程序持有一個對象的引用,該對象可能是一個File對象或一個數(shù)據(jù)庫對象。 它可能是由運行時間設(shè)置決定的,在這個階段,程序可能不知道或關(guān)心哪一個。
當(dāng)程序在對象上調(diào)用StoreRecord時,需要確定哪些行為被執(zhí)行。
該程序?qū)toreRecord消息發(fā)送給未知類型的對象,并將其留給運行時支持系統(tǒng)以將消息分派給正確的對象。 該對象實現(xiàn)它實現(xiàn)的任何行為。

動態(tài)分派與靜態(tài)分派形成對比,其中在編譯時選擇多態(tài)操作的實現(xiàn)。

動態(tài)分派的目的是為了支持在編譯時無法確定多態(tài)操作的適當(dāng)實現(xiàn)的情況,因為它依賴于操作的一個或多個實際參數(shù)的運行時類型。

靜態(tài)分派:編譯階段即可確定要執(zhí)行哪個具體操作。
重載的方法使用靜態(tài)分派,而重寫的方法在運行時使用動態(tài)分派。

動態(tài)分派不同于動態(tài)綁定(也稱為動態(tài)綁定)。

選擇操作時,綁定會將名稱與操作關(guān)聯(lián)。

在決定了名稱引用的操作后,分派會為操作選擇一個實現(xiàn)。

綁定:將調(diào)用的名字與實際的方法名字聯(lián)系起來(可能很多個);
分派:具體執(zhí)行哪個方法(提前綁定→靜態(tài)分派)

通過動態(tài)分派,該名稱可以在編譯時綁定到多態(tài)操作,但不會在運行時間之前選擇實現(xiàn)。動態(tài)分派:編譯階段可能綁定到多態(tài)操作,運行階段決定具體執(zhí)行哪個(覆蓋和過載均是如此);

雖然動態(tài)分派并不意味著動態(tài)綁定,但動態(tài)綁定確實意味著動態(tài)分派,因為綁定決定了可用分派的集合。

提前/靜態(tài)綁定

每當(dāng)發(fā)生靜態(tài),私有和最終方法的綁定時,類的類型由編譯器在編譯時確定,并且綁定在那里和那里發(fā)生。

推遲/動態(tài)綁定

重寫父類和子類都有相同的方法,在這種情況下,對象的類型決定了要執(zhí)行哪種方法。 對象的類型在運行時確定。

動態(tài)方法分派

1.(編譯時)確定要查找哪個類
2.(編譯時)確定要執(zhí)行的方法簽名

查找所有可訪問的適用方法

選擇最具體的匹配方法

3.(運行時)確定接收器的動態(tài)類別
4.(運行時)從動態(tài)類中,找到要調(diào)用的方法

在第2步中找到具有相同簽名的方法

否則在超類中搜索等。

10 Java中的一些重要的Object方法

equals() - 如果兩個對象“相等”,則為true
hashCode() - 用于哈希映射的哈希代碼
toString() - 可打印的字符串表示形式

toString() - 丑陋而無信息

你知道你的目標是什么,所以你可以做得更好

總是覆蓋,除非你知道不會被調(diào)用

equals&hashCode - 身份語義

如果你想要價值語義,你必須重寫

否則不要

設(shè)計好的類

不可變類的優(yōu)點

簡單
本質(zhì)上是線程安全的
可以自由分享
不需要防御式拷貝
優(yōu)秀的積木

如何編寫一個不可變的類

不要提供任何變值器
確保沒有方法可能被覆蓋
使所有的領(lǐng)域最終
使所有字段保密
確保任何可變組件的安全性(避免重復(fù)曝光)
實現(xiàn)toString(),hashCode(),clone(),equals()等。

何時讓類不可變
總是,除非有充分的理由不這樣做
總是讓小型“價值類”永恒不變!

何時讓類可變

類表示狀態(tài)改變的實體

真實世界 - 銀行賬戶,紅綠燈

抽象 - 迭代器,匹配器,集合

進程類 - 線程,計時器

如果類必須是可變的,則最小化可變性

構(gòu)造函數(shù)應(yīng)該完全初始化實例

避免重新初始化方法

OOP的歷史

仿真和面向?qū)ο缶幊痰钠鹪?/p>

20世紀60年代:Simula 67是第一個由Kristin Nygaardand Ole-Johan Dahl在挪威計算中心開發(fā)的面向?qū)ο笳Z言,用于支持離散事件模擬。 (類,對象,繼承等)
“面向?qū)ο缶幊蹋∣OP)”這個術(shù)語最早是由施樂PARC在他們的Smalltalk語言中使用的。
20世紀80年代:面向?qū)ο笠呀?jīng)變得非常突出,而其中的主要因素是C ++。
NiklausWirth用于Oberon和Modula-2的模塊化編程和數(shù)據(jù)抽象;
埃菲爾和Java

總結(jié)

面向?qū)ο蟮臉藴?br>基本概念:對象,類,屬性,方法和接口
OOP的獨特功能

封裝和信息隱藏
繼承和重寫
多態(tài)性,子類型和重載
靜態(tài)和動態(tài)調(diào)度

Java中一些重要的Object方法
編寫一個不可變的類
OOP的歷史

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71327.html

相關(guān)文章

  • 3抽象數(shù)據(jù)類型ADT面向對象編程OOP3.5 ADTOOP中的等價性

    摘要:抽象函數(shù)引發(fā)的關(guān)系是等價關(guān)系。所以當(dāng)且僅當(dāng)通過調(diào)用抽象數(shù)據(jù)類型的任何操作不能區(qū)分它們時,兩個對象是相等的。必須為每個抽象數(shù)據(jù)類型適當(dāng)?shù)囟x操作。一般來說,在面向?qū)ο缶幊讨惺褂檬且环N陋習(xí)。 大綱 什么是等價性?為什么要討論等價性?三種等價性的方式==與equals()不可變類型的等價性對象契約可變類型的等價性自動包裝和等價性 什么是等價性?為什么要討論等價性? ADT上的相等操作 ADT...

    Fundebug 評論0 收藏0
  • 3抽象數(shù)據(jù)類型ADT面向對象編程OOP3.2設(shè)計規(guī)約

    摘要:程序失敗時,很難確定錯誤的位置。它保護客戶免受單位工作細節(jié)的影響。將前提條件放在中,并將后置條件放入和。涉及可變對象的契約現(xiàn)在取決于每個引用可變對象的每個人的良好行為。設(shè)計規(guī)約按規(guī)約分類比較規(guī)約它是如何確定性的。 大綱 1.編程語言中的功能/方法2.規(guī)約:便于交流的編程,為什么需要規(guī)約 行為等同規(guī)約結(jié)構(gòu):前提條件和后條件測試和驗證規(guī)約3.設(shè)計規(guī)約分類規(guī)約圖表規(guī)約質(zhì)量規(guī)約4.總結(jié) 編程...

    mozillazg 評論0 收藏0
  • 3抽象數(shù)據(jù)類型ADT面向對象編程OOP3.1數(shù)據(jù)類型類型檢查

    摘要:所有變量的類型在編譯時已知在程序運行之前,因此編譯器也可以推導(dǎo)出所有表達式的類型。像變量的類型一樣,這些聲明是重要的文檔,對代碼讀者很有用,并由編譯器進行靜態(tài)檢查。對象類型的值對象類型的值是由其類型標記的圓。 大綱 1.編程語言中的數(shù)據(jù)類型2.靜態(tài)與動態(tài)數(shù)據(jù)類型3.類型檢查4.易變性和不變性5.快照圖6.復(fù)雜的數(shù)據(jù)類型:數(shù)組和集合7.有用的不可變類型8.空引用9.總結(jié) 編程語言中的數(shù)據(jù)...

    zhangqh 評論0 收藏0
  • 軟件構(gòu)造lab2

    摘要:本次實驗訓(xùn)練抽象數(shù)據(jù)類型的設(shè)計規(guī)約測試,并使用面向?qū)ο缶幊碳夹g(shù)實現(xiàn)。改成泛型將函數(shù)聲明和調(diào)用等修改一下即可調(diào)用之前我們實現(xiàn)的一個圖結(jié)構(gòu)實現(xiàn)方法如下讀取文件輸入,識別序列,構(gòu)建圖結(jié)構(gòu)。 本次實驗訓(xùn)練抽象數(shù)據(jù)類型(ADT)的設(shè)計、規(guī)約、測試,并使用面向?qū)ο缶幊蹋∣OP)技術(shù)實現(xiàn) ADT。 3.1 Poetic Walks建立對ADT的基本印象,比如如何設(shè)計一個能夠泛型化的ADT。加深對AF...

    孫吉亮 評論0 收藏0
  • 樂字節(jié)Java編程語言發(fā)展、面向對象

    摘要:二面向?qū)ο蟾攀雒嫦蜻^程的設(shè)計思想和面向?qū)ο蟮脑O(shè)計思想我要吃魚香肉絲蓋飯面向過程我買菜我洗菜我切菜我放水我點火我做飯我炒菜。。。。 大家好,上次我們講過了樂字節(jié)Java編程之方法、調(diào)用、重載、遞歸,接下來我們將會進入到Java封裝的內(nèi)容。Java編程語言發(fā)展,面向?qū)ο蠛皖悺?一、編程語言的發(fā)展 機器語言——直接由計算機的指令組成,指令、數(shù)據(jù)、地址都以0和1組成:可以被計算機直接識別并執(zhí)行...

    lufficc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<