摘要:所有變量的類型在編譯時(shí)已知在程序運(yùn)行之前,因此編譯器也可以推導(dǎo)出所有表達(dá)式的類型。像變量的類型一樣,這些聲明是重要的文檔,對(duì)代碼讀者很有用,并由編譯器進(jìn)行靜態(tài)檢查。對(duì)象類型的值對(duì)象類型的值是由其類型標(biāo)記的圓。
大綱
1.編程語(yǔ)言中的數(shù)據(jù)類型
2.靜態(tài)與動(dòng)態(tài)數(shù)據(jù)類型
3.類型檢查
4.易變性和不變性
5.快照?qǐng)D
6.復(fù)雜的數(shù)據(jù)類型:數(shù)組和集合
7.有用的不可變類型
8.空引用
9.總結(jié)
類型和變量
類型是一組值,以及可以對(duì)這些值執(zhí)行的操作。
變量:存儲(chǔ)一個(gè)特定類型值的命名位置
Java中的類型
Java有幾種基本類型,例如:
int(對(duì)于像5和-200這樣的整數(shù),但限于±2 ^ 31或大約±20億的范圍)
長(zhǎng)(對(duì)于大于±2 ^ 63的整數(shù))
布爾值(對(duì)于true或false)
雙精度浮點(diǎn)數(shù)(代表實(shí)數(shù)的一個(gè)子集)
char(單個(gè)字符,如"A"和"$")
Java也有對(duì)象類型,例如:
字符串表示一系列字符。
BigInteger表示一個(gè)任意大小的整數(shù)。
按照J(rèn)ava約定,基本類型是小寫(xiě)字母,而對(duì)象類型以大寫(xiě)字母開(kāi)頭。
對(duì)象類型的層次結(jié)構(gòu)
根是Object(所有非基元都是對(duì)象)
除Object以外的所有類都有一個(gè)父類,使用extends子句指定
class Guitar extends Instrument { ... }
如果省略了子句,則默認(rèn)為Object
一個(gè)類是其所有超類的一個(gè)實(shí)例
從其超類繼承可見(jiàn)的字段和方法
可以覆蓋(Override)方法來(lái)改變他們的行為
包裝的基本類型
用于原始類型的不變?nèi)萜?br>– Boolean, Integer, Short, Long, Character, Float, Double
典型用例是集合
除非你必須使用包裝的基本類型!
語(yǔ)言自動(dòng)包裝和自動(dòng)解包裝
運(yùn)算符
運(yùn)算符:執(zhí)行簡(jiǎn)單計(jì)算的符號(hào)
賦值:=
加法:+
減法: -
乘法:*
除法:/
操作順序:遵循標(biāo)準(zhǔn)的數(shù)學(xué)規(guī)則
1.括號(hào)
2.乘法和除法
3.加法和減法
字符串連接(+)
操作
操作是獲取輸入和生成輸出的函數(shù)(有時(shí)會(huì)自行更改值)。
作為中綴,前綴或后綴運(yùn)算符。 例如,a + b調(diào)用操作+:int×int→int。
作為一個(gè)對(duì)象的方法。 例如,bigint1.add(bigint2)調(diào)用操作add:BigInteger×BigInteger→BigInteger。
作為一項(xiàng)功能。 例如,Math.sin(theta)調(diào)用sin:double→double操作。 在這里,數(shù)學(xué)不是一個(gè)對(duì)象。 這是包含sin函數(shù)的類。
重載操作符/操作
一些操作被重載,因?yàn)橄嗤牟僮髅Q用于不同的類型
對(duì)于Java中的數(shù)字基本數(shù)據(jù)類型,算術(shù)運(yùn)算符+, - ,*,/會(huì)嚴(yán)重重載。
方法也可以重載。 大多數(shù)編程語(yǔ)言都有一定程度的重載。
(將在3.3節(jié)OOP中討論)
靜態(tài)輸入與動(dòng)態(tài)輸入
Java是一種靜態(tài)類型的語(yǔ)言。
所有變量的類型在編譯時(shí)已知(在程序運(yùn)行之前),因此編譯器也可以推導(dǎo)出所有表達(dá)式的類型。
如果將a和b聲明為int,則編譯器得出結(jié)論a + b也是int。
在編寫(xiě)代碼時(shí),Eclipse環(huán)境會(huì)執(zhí)行此操作,事實(shí)上,您仍然可以在輸入時(shí)了解許多錯(cuò)誤。
在編譯階段進(jìn)行類型檢查
在像Python這樣的動(dòng)態(tài)類型語(yǔ)言中,這種檢查被推遲到運(yùn)行時(shí)(程序運(yùn)行時(shí))。
3.類型檢查
靜態(tài)檢查和動(dòng)態(tài)檢查
一種語(yǔ)言可以提供的三種自動(dòng)檢查:
靜態(tài)檢查:在程序運(yùn)行之前會(huì)自動(dòng)發(fā)現(xiàn)錯(cuò)誤。
動(dòng)態(tài)檢查:執(zhí)行代碼時(shí)會(huì)自動(dòng)發(fā)現(xiàn)錯(cuò)誤。
不檢查:語(yǔ)言根本無(wú)助于您找到錯(cuò)誤。 你必須親自觀察,否則最終會(huì)得到錯(cuò)誤的答案。
不用說(shuō),靜態(tài)捕獲一個(gè)bug比動(dòng)態(tài)捕獲它要好,動(dòng)態(tài)捕獲它比根本沒(méi)有捕獲它要好。
靜態(tài)檢查
靜態(tài)檢查意味著在編譯時(shí)檢查錯(cuò)誤。
錯(cuò)誤是編程的禍根。
靜態(tài)類型可以防止大量的錯(cuò)誤感染程序:準(zhǔn)確地說(shuō),通過(guò)對(duì)錯(cuò)誤類型的參數(shù)應(yīng)用操作而導(dǎo)致的錯(cuò)誤。
如果你寫(xiě)了一行代碼,如:“5”*“6”,它試圖乘以兩個(gè)字符串,那么靜態(tài)類型在編程時(shí)會(huì)捕獲這個(gè)錯(cuò)誤,而不是等到執(zhí)行過(guò)程中到達(dá)該行。
語(yǔ)法錯(cuò)誤,如額外的標(biāo)點(diǎn)符號(hào)或假詞。 即使是像Python這樣的動(dòng)態(tài)類型語(yǔ)言也可以進(jìn)行這種靜態(tài)檢查。
錯(cuò)誤的名字,如Math.sine(2)。 (正確的名字是sin)
錯(cuò)誤的參數(shù)數(shù)量,如Math.sin(30,20)。
錯(cuò)誤的參數(shù)類型,如Math.sin(“30”)。
錯(cuò)誤的返回類型,如返回“30”; 從聲明的函數(shù)返回一個(gè)int。
動(dòng)態(tài)檢查
非法的參數(shù)值。 例如,當(dāng)y實(shí)際上為零時(shí),整數(shù)表達(dá)式x / y只是錯(cuò)誤的; 否則它將運(yùn)行。 所以在這個(gè)表達(dá)式中,除零不是一個(gè)靜態(tài)錯(cuò)誤,而是一個(gè)動(dòng)態(tài)錯(cuò)誤。
不具有代表性的返回值,即特定返回值無(wú)法在類型中表示時(shí)。
超出范圍的索引,例如,在字符串上使用負(fù)值或太大的索引。
在空對(duì)象引用上調(diào)用方法。
靜態(tài)與動(dòng)態(tài)檢查
靜態(tài)檢查往往是關(guān)于類型的,與變量具有的特定值無(wú)關(guān)的錯(cuò)誤。
靜態(tài)類型保證了一個(gè)變量會(huì)從該集合中獲得一些值,但是我們直到運(yùn)行時(shí)才知道它具有哪個(gè)值。
所以如果錯(cuò)誤只會(huì)被某些值引起,比如被零除或索引超出范圍,那么編譯器不會(huì)引發(fā)關(guān)于它的靜態(tài)錯(cuò)誤。
相比之下,動(dòng)態(tài)檢查往往是由特定值引起的錯(cuò)誤。
原始數(shù)據(jù)類型不是真正的數(shù)字
Java中的一個(gè)陷阱 - 以及其他許多編程語(yǔ)言 - 就是它的原始數(shù)字類型具有不像我們習(xí)慣的整數(shù)和實(shí)數(shù)那樣的特例。
結(jié)果,真正應(yīng)該動(dòng)態(tài)檢查的一些錯(cuò)誤根本不被檢查。
整數(shù)除法:5/2不返回分?jǐn)?shù),它返回一個(gè)截?cái)嗟恼麛?shù)。
整數(shù)溢出。 如果計(jì)算結(jié)果過(guò)于積極或過(guò)于消極而無(wú)法適應(yīng)該有限范圍,則會(huì)悄然溢出并返回錯(cuò)誤答案。 (沒(méi)有靜態(tài)/動(dòng)態(tài)檢查!)例如,int big = 200000 * 200000;
浮點(diǎn)類型中的特殊值。 NaN(“不是數(shù)字”),POSITIVE_INFINITY和NEGATIVE_INFINITY。 例如,double a = 7/0;
4可變性和不變性
賦值
使用“=”給變量賦值
賦值可以和變量聲明結(jié)合使用
更改變量或其值
改變變量和改變數(shù)值有什么區(qū)別?
當(dāng)你分配給變量時(shí),你正在改變變量的箭頭指向的地方。 您可以將其指向不同的值。
當(dāng)分配給可變值的內(nèi)容時(shí)(例如數(shù)組或列表),您將在該值內(nèi)改變引用。
變化是必要的罪惡。
好的程序員可以避免變化的事情,因?yàn)樗鼈兛赡軙?huì)意外地改變。
不變性
不變性是一個(gè)主要的設(shè)計(jì)原則。
不可變類型是一種類型,它們的值一旦創(chuàng)建就永遠(yuǎn)不會(huì)改變。
Java也為我們提供了不可變的引用:一次賦值且永不重新賦值的變量。
為了使引用不可變,用關(guān)鍵字final聲明它。
如果Java編譯器不確定最終變量只會(huì)在運(yùn)行時(shí)分配一次,那么它將產(chǎn)生編譯器錯(cuò)誤。 所以最終給你靜態(tài)檢查不可變引用。
最好使用final來(lái)聲明方法的參數(shù)和盡可能多的局部變量。
像變量的類型一樣,這些聲明是重要的文檔,對(duì)代碼讀者很有用,并由編譯器進(jìn)行靜態(tài)檢查。
注意:
fianl的類聲明意味著它不能被繼承。
final變量意味著它始終包含相同的值/參考,但不能最終更改
final方法意味著它不能被子類覆蓋
可變性和不變性
對(duì)象是不可變的:一旦創(chuàng)建,它們總是表示相同的值。
對(duì)象是可變的:它們具有改變對(duì)象值的方法。
字符串作為不可變類型
字符串是不可變類型的一個(gè)例子。
一個(gè)String對(duì)象總是表示相同的字符串。
由于String是不可變的,一旦創(chuàng)建,String對(duì)象始終具有相同的值。
要將某些內(nèi)容添加到字符串的末尾,您必須創(chuàng)建一個(gè)新的String對(duì)象:
StringBuilder作為一個(gè)可變類型
StringBuilder是一個(gè)可變類型的例子。
它具有刪除字符串部分,插入或替換字符等的方法
該類具有更改對(duì)象值的方法,而不僅僅是返回新值:
可變類型的優(yōu)點(diǎn)
使用不可變的字符串,這會(huì)產(chǎn)生大量的臨時(shí)副本
獲得良好的性能是我們使用可變對(duì)象的一個(gè)原因。
另一個(gè)是方便共享:通過(guò)共享一個(gè)常見(jiàn)的可變數(shù)據(jù)結(jié)構(gòu),您的程序的兩個(gè)部分可以更方便地進(jìn)行通信。
“全局變量”
但是你必須知道全局變量的缺點(diǎn)......
5快照?qǐng)D作為Code-level,Run-time,Moment視圖
快照?qǐng)D
為了理解微妙的問(wèn)題,我們可以繪制運(yùn)行時(shí)發(fā)生的事情的圖片。
快照?qǐng)D在運(yùn)行時(shí)表示程序的內(nèi)部狀態(tài) - 其堆棧(正在進(jìn)行的方法及其局部變量)及其堆(當(dāng)前存在的對(duì)象)。
為什么我們使用快照?qǐng)D表?
通過(guò)圖片相互交流。
為了說(shuō)明基本類型與對(duì)象類型,不可變值與不可變引用,指針別名,堆棧與堆,抽象與具體表示等概念。
幫助解釋您的團(tuán)隊(duì)項(xiàng)目設(shè)計(jì)(彼此之間以及與您的技術(shù)援助相關(guān))。
為后續(xù)課程中豐富的設(shè)計(jì)符號(hào)鋪平道路。
可變值與重新分配變量
快照?qǐng)D給我們提供了一種可視化更改變量和更改值之間區(qū)別的方法:
當(dāng)您分配給變量或字段時(shí),您將更改變量的箭頭指向的位置。 您可以將其指向不同的值。
當(dāng)分配給可變值的內(nèi)容時(shí)(例如數(shù)組或列表),您將在該值內(nèi)改變引用。
快照?qǐng)D中的基本類型和對(duì)象類型
基本類型的值
基本類型的值由裸常量表示。 傳入的箭頭是對(duì)來(lái)自變量或?qū)ο笞侄蔚闹档囊谩?/p>
對(duì)象類型的值
對(duì)象類型的值是由其類型標(biāo)記的圓。
當(dāng)我們想要顯示更多細(xì)節(jié)時(shí),我們?cè)谄渲袑?xiě)入字段名稱,箭頭指向它們的值。 有關(guān)更詳細(xì)的信息,這些字段可以包含它們的聲明類型。
重新分配和不可變的值
例如,如果我們有一個(gè)字符串變量s,我們可以將其從“a”值重新分配給“ab”
String s =“a”;
s = s +“b”;?
字符串是不可變類型的一個(gè)例子,一種類型的值一旦創(chuàng)建就永遠(yuǎn)不會(huì)改變。?
不變對(duì)象(它們的設(shè)計(jì)者打算始終表示相同的值)在快照?qǐng)D中用雙邊框表示,就像我們圖中的String對(duì)象一樣。
可變的值
相比之下,StringBuilder(一個(gè)內(nèi)置的Java類)是一個(gè)可變對(duì)象,表示一串字符,并且它具有更改對(duì)象值的方法:
StringBuilder sb = new StringBuilder(“a”);
sb.append( “B”);
這兩個(gè)快照?qǐng)D看起來(lái)非常不同,這是很好的:可變性和不可變性之間的差異將在使代碼免受bug影響方面發(fā)揮重要作用。
不變的引用
Java也為我們提供了不可變的引用:一次賦值且永不重新賦值的變量。 為了使引用不可變,用關(guān)鍵字final聲明它:
final int n = 5;
如果Java編譯器不確定最終變量只會(huì)在運(yùn)行時(shí)分配一次,那么它將產(chǎn)生編譯器錯(cuò)誤。 所以最終給出了對(duì)不可變引用的靜態(tài)檢查。
在快照?qǐng)D中,不可變引用(final)由雙箭頭表示。
6復(fù)雜的數(shù)據(jù)類型:數(shù)組和集合
數(shù)組
數(shù)組是另一個(gè)類型T的固定長(zhǎng)度序列。例如,下面是如何聲明一個(gè)數(shù)組變量并構(gòu)造一個(gè)數(shù)組值以分配給它:
int [] a = new int [100];
int []數(shù)組類型包含所有可能的數(shù)組值,但是一旦創(chuàng)建了特定的數(shù)組值,永遠(yuǎn)不會(huì)改變其長(zhǎng)度。
數(shù)組類型的操作包括:
索引:a [2]
賦值:a [2] = 0
長(zhǎng)度:a.length
列表
我們使用List類型來(lái)代替固定長(zhǎng)度的數(shù)組。
列表是另一個(gè)類型T的可變長(zhǎng)度序列。 List
其部分操作:
索引:list.get(2)
賦值:list.set(2,0)
長(zhǎng)度:list.size()
注1:列表是一個(gè)接口
注2:列表中的成員必須是一個(gè)對(duì)象。
集合
Set是零個(gè)或多個(gè)唯一對(duì)象的無(wú)序集合。
一個(gè)對(duì)象不能多次出現(xiàn)在一個(gè)集合中。 要么它在或它不在。
s1.contains(e)測(cè)試集合是否包含元素
s1.containsAll(s2)測(cè)試是否s1?s2
s1.removeAll(s2)從s1移除s2
Set是一個(gè)抽象接口
地圖
地圖類似于字典(key)
map.put(key,val)添加映射key→val
map.get(key)獲取一個(gè)key的值
map.containsKey(key)測(cè)試地圖是否有key
map.remove(key)刪除映射
地圖是一個(gè)抽象界面
聲明List,Set和Map變量
使用Java集合,我們可以限制集合中包含的對(duì)象的類型。
當(dāng)我們添加一個(gè)項(xiàng)目時(shí),編譯器可以執(zhí)行靜態(tài)檢查,以確保我們只添加適當(dāng)類型的項(xiàng)目。
然后,當(dāng)我們?nèi)〕鲆粋€(gè)對(duì)象時(shí),我們保證它的類型將是我們所期望的。
創(chuàng)建List,Set和Map變量
Java有助于區(qū)分
一種類型的規(guī)范 - 它有什么作用? 抽象接口 - 實(shí)現(xiàn)
代碼是什么? 具體類
List,Set和Map都是接口:
他們定義了這些相應(yīng)的類型是如何工作的,但他們不提供實(shí)現(xiàn)代碼。
優(yōu)點(diǎn):用戶有權(quán)在不同情況下選擇不同的實(shí)施方式。
List,Set和Map的實(shí)現(xiàn):
列表:ArrayList和LinkedList
集合:HashSet
地圖:HashMap
迭代器是一個(gè)可變類型的迭代器
迭代器是一個(gè)對(duì)象,它遍歷一組元素并逐個(gè)返回元素。
當(dāng)你使用for(...:...)循環(huán)遍歷一個(gè)List或數(shù)組時(shí),迭代器在Java中被使用。
迭代器有兩種方法:
next()返回集合中的下一個(gè)元素---這是一個(gè)可變的方法!
hasNext()測(cè)試迭代器是否已到達(dá)集合的末尾。
7有用的不可變類型
原始類型和原始包裝都是不可變的。
如果你需要用大數(shù)來(lái)計(jì)算,BigInteger和BigDecimal是不可變的。
不要使用可變?nèi)掌冢鶕?jù)您需要的計(jì)時(shí)粒度,使用java.time或java.time.ZonedDateTime中適當(dāng)?shù)牟豢勺冾愋汀?br>Java的集合類型(List,Set,Map)的通常實(shí)現(xiàn)都是可變的:ArrayList,HashMap等
Collections實(shí)用程序類具有獲取這些可變集合的不可修改視圖的方法:
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
可變數(shù)據(jù)類型的不可變包裝
Java集合類提供了一個(gè)有趣的折衷:不可變的包裝器。
Collections.unmodifiableList()需要一個(gè)(可變的)List,并且用一個(gè)看起來(lái)像List的對(duì)象封裝它,但是其禁用的mutator - set(),add(),remove()等會(huì)拋出異常。 所以你可以構(gòu)造一個(gè)使用mutator的列表,然后用一個(gè)不可修改的包裝器來(lái)封裝它(并且拋棄你對(duì)原始可變列表的引用,并且得到一個(gè)不變的列表。
缺點(diǎn)是你在運(yùn)行時(shí)獲得了不變性,但不是在編譯時(shí)。
如果你嘗試排序()這個(gè)不可修改的列表,Java在編譯時(shí)不會(huì)發(fā)出警告。
你會(huì)在運(yùn)行時(shí)得到一個(gè)異常。
但這還是比沒(méi)有好,所以使用不可修改的列表,地圖和集合可以是降低錯(cuò)誤風(fēng)險(xiǎn)的一種非常好的方法。
不可修改的包裝
不可修改的包裝器通過(guò)攔截所有修改集合并拋出UnsupportedOperationException的操作來(lái)取消修改集合的能力。
不可修改的包裝有兩個(gè)主要用途,如下所示:
一旦建立一個(gè)集合就不可變。 在這種情況下,最好不要保留對(duì)后備集合的引用。 這絕對(duì)保證了不變性。
允許某些客戶端只讀訪問(wèn)您的數(shù)據(jù)結(jié)構(gòu)。 您保留對(duì)后備集合的引用,但請(qǐng)分發(fā)引用。 這樣,客戶可以看,但不能修改,而你保持完全訪問(wèn)。
8空引用
空引用
在Java中,對(duì)對(duì)象和數(shù)組的引用也可以采用特殊值Null,這意味著引用不指向?qū)ο蟆?空值是Java類型系統(tǒng)中的一個(gè)不幸的漏洞。
基元不能為null,編譯器會(huì)拒絕這種帶有靜態(tài)錯(cuò)誤的嘗試:
int size = null; //非法
可以將null分配給任何非原始變量,并且編譯器在編譯時(shí)高興地接受這些代碼。 但是你會(huì)在運(yùn)行時(shí)遇到錯(cuò)誤,因?yàn)槟悴荒苷{(diào)用任何方法或者使用帶有這些引用之一的任何字段(拋出NullPointerExceptions):
String name = null;
name.length();
int [] points = null;
points.length;
null與空字符串“”或空數(shù)組不同。
空引用
非基元和像List這樣的集合的數(shù)組可能是非空的,但包含null作為值
只要有人試圖使用集合的內(nèi)容,這些空值就可能導(dǎo)致錯(cuò)誤。
空值是麻煩和不安全的,所以你最好建議將它們從你的設(shè)計(jì)詞匯表中刪除。
空值在參數(shù)和返回值中被隱式禁止。
來(lái)自Guava(Google)
不小心使用null會(huì)導(dǎo)致各種各樣的錯(cuò)誤。
研究谷歌代碼庫(kù),我們發(fā)現(xiàn)像95%的集合不應(yīng)該有任何空值,并且讓這些快速失敗而不是默默接受空值會(huì)對(duì)開(kāi)發(fā)人員有所幫助。
另外,null很不明確。
很少有人明白空返回值應(yīng)該是什么意思 - 例如,Map.get(key)可以返回null,因?yàn)閙ap中的值為null,或者該值不在map中。 空可能意味著失敗,可能意味著成功,幾乎意味著任何事情。
使用除null之外的其他內(nèi)容可以明確您的意思。
總結(jié)
靜態(tài)類型檢查:
減少錯(cuò)誤保證安全。 靜態(tài)檢查通過(guò)在運(yùn)行時(shí)捕獲類型錯(cuò)誤和其他錯(cuò)誤來(lái)幫助安全。
容易明白。 它有助于理解,因?yàn)轭愋驮诖a中已明確說(shuō)明。
準(zhǔn)備改變。 靜態(tài)檢查通過(guò)識(shí)別需要一起更改的其他位置來(lái)更容易地更改代碼。 例如,當(dāng)您更改變量的名稱或類型時(shí),編譯器會(huì)立即在使用該變量的所有位置顯示錯(cuò)誤,并提醒您更新它們。
可變性對(duì)于性能和便利性很有用,但它也會(huì)通過(guò)要求使用對(duì)象的代碼在全范圍內(nèi)表現(xiàn)良好而造成bug的風(fēng)險(xiǎn),這極大地增加了我們必須做的推理和測(cè)試,以確保其正確性。?
確保你了解不可變對(duì)象(如String)和不可變引用(如final變量)之間的區(qū)別。?
快照?qǐng)D可以幫助理解。
對(duì)象是由快照?qǐng)D中的圓圈表示的值,而不可變的對(duì)象是具有雙邊框的值,表示它永遠(yuǎn)不會(huì)更改其值。
引用是一個(gè)指向?qū)ο蟮闹羔槪每煺請(qǐng)D中的箭頭表示,不可變引用是帶有雙線的箭頭,表示不能將箭頭移動(dòng)到指向不同的對(duì)象。
關(guān)鍵的設(shè)計(jì)原則是不變性:盡可能使用不可變對(duì)象和不可變引用。
減少錯(cuò)誤保證安全。 不可變對(duì)象不容易出現(xiàn)鋸齒引起的錯(cuò)誤。 不可變引用總是指向同一個(gè)對(duì)象。
容易明白。 因?yàn)椴豢勺兊膶?duì)象或引用總是意味著相同的事物,所以代碼讀者推理起來(lái)更簡(jiǎn)單 - 他們不必追蹤所有代碼以找到可能更改對(duì)象或引用的所有位置,因?yàn)?它不能改變。
準(zhǔn)備好改變。 如果在運(yùn)行時(shí)不能更改對(duì)象或引用,那么當(dāng)程序更改時(shí),不需要修改依賴于該對(duì)象或引用的代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71330.html
摘要:抽象數(shù)據(jù)類型的多個(gè)不同表示可以共存于同一個(gè)程序中,作為實(shí)現(xiàn)接口的不同類。封裝和信息隱藏信息隱藏將精心設(shè)計(jì)的模塊與不好的模塊區(qū)分開(kāi)來(lái)的唯一最重要的因素是其隱藏內(nèi)部數(shù)據(jù)和其他模塊的其他實(shí)施細(xì)節(jié)的程度。 大綱 面向?qū)ο蟮臉?biāo)準(zhǔn)基本概念:對(duì)象,類,屬性,方法和接口OOP的獨(dú)特功能 封裝和信息隱藏 繼承和重寫(xiě) 多態(tài)性,子類型和重載 靜態(tài)與動(dòng)態(tài)分派 Java中一些重要的Object方法設(shè)計(jì)好的類面向...
摘要:抽象函數(shù)引發(fā)的關(guān)系是等價(jià)關(guān)系。所以當(dāng)且僅當(dāng)通過(guò)調(diào)用抽象數(shù)據(jù)類型的任何操作不能區(qū)分它們時(shí),兩個(gè)對(duì)象是相等的。必須為每個(gè)抽象數(shù)據(jù)類型適當(dāng)?shù)囟x操作。一般來(lái)說(shuō),在面向?qū)ο缶幊讨惺褂檬且环N陋習(xí)。 大綱 什么是等價(jià)性?為什么要討論等價(jià)性?三種等價(jià)性的方式==與equals()不可變類型的等價(jià)性對(duì)象契約可變類型的等價(jià)性自動(dòng)包裝和等價(jià)性 什么是等價(jià)性?為什么要討論等價(jià)性? ADT上的相等操作 ADT...
摘要:程序失敗時(shí),很難確定錯(cuò)誤的位置。它保護(hù)客戶免受單位工作細(xì)節(jié)的影響。將前提條件放在中,并將后置條件放入和。涉及可變對(duì)象的契約現(xiàn)在取決于每個(gè)引用可變對(duì)象的每個(gè)人的良好行為。設(shè)計(jì)規(guī)約按規(guī)約分類比較規(guī)約它是如何確定性的。 大綱 1.編程語(yǔ)言中的功能/方法2.規(guī)約:便于交流的編程,為什么需要規(guī)約 行為等同規(guī)約結(jié)構(gòu):前提條件和后條件測(cè)試和驗(yàn)證規(guī)約3.設(shè)計(jì)規(guī)約分類規(guī)約圖表規(guī)約質(zhì)量規(guī)約4.總結(jié) 編程...
摘要:本次實(shí)驗(yàn)訓(xùn)練抽象數(shù)據(jù)類型的設(shè)計(jì)規(guī)約測(cè)試,并使用面向?qū)ο缶幊碳夹g(shù)實(shí)現(xiàn)。改成泛型將函數(shù)聲明和調(diào)用等修改一下即可調(diào)用之前我們實(shí)現(xiàn)的一個(gè)圖結(jié)構(gòu)實(shí)現(xiàn)方法如下讀取文件輸入,識(shí)別序列,構(gòu)建圖結(jié)構(gòu)。 本次實(shí)驗(yàn)訓(xùn)練抽象數(shù)據(jù)類型(ADT)的設(shè)計(jì)、規(guī)約、測(cè)試,并使用面向?qū)ο缶幊蹋∣OP)技術(shù)實(shí)現(xiàn) ADT。 3.1 Poetic Walks建立對(duì)ADT的基本印象,比如如何設(shè)計(jì)一個(gè)能夠泛型化的ADT。加深對(duì)AF...
摘要:抽象工廠模式將具有共同主題的對(duì)象工廠分組。對(duì)可重用性和可維護(hù)性設(shè)計(jì)模式的高層考慮創(chuàng)造性模式工廠方法模式也稱為虛擬構(gòu)造器意圖定義一個(gè)用于創(chuàng)建對(duì)象的接口,但讓子類決定實(shí)例化哪個(gè)類。 大綱 創(chuàng)造性模式 工廠方法模式創(chuàng)建對(duì)象而不指定要?jiǎng)?chuàng)建的確切類。 抽象工廠模式將具有共同主題的對(duì)象工廠分組。 Builder模式通過(guò)分離構(gòu)造和表示來(lái)構(gòu)造復(fù)雜的對(duì)象。 結(jié)構(gòu)模式 Bridge將抽象從其實(shí)現(xiàn)中分...
閱讀 3095·2021-10-15 09:41
閱讀 3167·2021-09-22 16:05
閱讀 2404·2021-09-22 15:19
閱讀 2873·2021-09-02 15:11
閱讀 2446·2019-08-30 15:52
閱讀 831·2019-08-30 11:06
閱讀 1000·2019-08-29 16:44
閱讀 1238·2019-08-23 18:18