国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

第3章:抽象數據類型(ADT)和面向對象編程(OOP) 3.1數據類型和類型檢查

zhangqh / 2785人閱讀

摘要:所有變量的類型在編譯時已知在程序運行之前,因此編譯器也可以推導出所有表達式的類型。像變量的類型一樣,這些聲明是重要的文檔,對代碼讀者很有用,并由編譯器進行靜態檢查。對象類型的值對象類型的值是由其類型標記的圓。

大綱

1.編程語言中的數據類型
2.靜態與動態數據類型
3.類型檢查
4.易變性和不變性
5.快照圖
6.復雜的數據類型:數組和集合
7.有用的不可變類型
8.空引用
9.總結

編程語言中的數據類型

類型和變量

類型是一組值,以及可以對這些值執行的操作。
變量:存儲一個特定類型值的命名位置

Java中的類型

Java有幾種基本類型,例如:

int(對于像5和-200這樣的整數,但限于±2 ^ 31或大約±20億的范圍)

長(對于大于±2 ^ 63的整數)

布爾值(對于true或false)

雙精度浮點數(代表實數的一個子集)

char(單個字符,如"A"和"$")

Java也有對象類型,例如:

字符串表示一系列字符。

BigInteger表示一個任意大小的整數。

按照Java約定,基本類型是小寫字母,而對象類型以大寫字母開頭。

對象類型的層次結構

根是Object(所有非基元都是對象)

除Object以外的所有類都有一個父類,使用extends子句指定

class Guitar extends Instrument { ... }
如果省略了子句,則默認為Object
一個類是其所有超類的一個實例

從其超類繼承可見的字段和方法

可以覆蓋(Override)方法來改變他們的行為

包裝的基本類型

用于原始類型的不變容器
– Boolean, Integer, Short, Long, Character, Float, Double
典型用例是集合
除非你必須使用包裝的基本類型!
語言自動包裝和自動解包裝

運算符

運算符:執行簡單計算的符號

賦值:=

加法:+

減法: -

乘法:*

除法:/

操作順序:遵循標準的數學規則

1.括號

2.乘法和除法

3.加法和減法

字符串連接(+)

操作

操作是獲取輸入和生成輸出的函數(有時會自行更改值)。

作為中綴,前綴或后綴運算符。 例如,a + b調用操作+:int×int→int。

作為一個對象的方法。 例如,bigint1.add(bigint2)調用操作add:BigInteger×BigInteger→BigInteger。

作為一項功能。 例如,Math.sin(theta)調用sin:double→double操作。 在這里,數學不是一個對象。 這是包含sin函數的類。

重載操作符/操作

一些操作被重載,因為相同的操作名稱用于不同的類型
對于Java中的數字基本數據類型,算術運算符+, - ,*,/會嚴重重載。
方法也可以重載。 大多數編程語言都有一定程度的重載。
(將在3.3節OOP中討論)

靜態輸入與動態輸入

Java是一種靜態類型的語言。

所有變量的類型在編譯時已知(在程序運行之前),因此編譯器也可以推導出所有表達式的類型。

如果將a和b聲明為int,則編譯器得出結論a + b也是int。

在編寫代碼時,Eclipse環境會執行此操作,事實上,您仍然可以在輸入時了解許多錯誤。

在編譯階段進行類型檢查

在像Python這樣的動態類型語言中,這種檢查被推遲到運行時(程序運行時)。

3.類型檢查

靜態檢查和動態檢查

一種語言可以提供的三種自動檢查:

靜態檢查:在程序運行之前會自動發現錯誤。

動態檢查:執行代碼時會自動發現錯誤。

不檢查:語言根本無助于您找到錯誤。 你必須親自觀察,否則最終會得到錯誤的答案。

不用說,靜態捕獲一個bug比動態捕獲它要好,動態捕獲它比根本沒有捕獲它要好。

靜態檢查

靜態檢查意味著在編譯時檢查錯誤。
錯誤是編程的禍根。
靜態類型可以防止大量的錯誤感染程序:準確地說,通過對錯誤類型的參數應用操作而導致的錯誤。
如果你寫了一行代碼,如:“5”*“6”,它試圖乘以兩個字符串,那么靜態類型在編程時會捕獲這個錯誤,而不是等到執行過程中到達該行。

語法錯誤,如額外的標點符號或假詞。 即使是像Python這樣的動態類型語言也可以進行這種靜態檢查。

錯誤的名字,如Math.sine(2)。 (正確的名字是sin)

錯誤的參數數量,如Math.sin(30,20)。

錯誤的參數類型,如Math.sin(“30”)。

錯誤的返回類型,如返回“30”; 從聲明的函數返回一個int。

動態檢查

非法的參數值。 例如,當y實際上為零時,整數表達式x / y只是錯誤的; 否則它將運行。 所以在這個表達式中,除零不是一個靜態錯誤,而是一個動態錯誤。

不具有代表性的返回值,即特定返回值無法在類型中表示時。

超出范圍的索引,例如,在字符串上使用負值或太大的索引。

在空對象引用上調用方法。

靜態與動態檢查

靜態檢查往往是關于類型的,與變量具有的特定值無關的錯誤。

靜態類型保證了一個變量會從該集合中獲得一些值,但是我們直到運行時才知道它具有哪個值。

所以如果錯誤只會被某些值引起,比如被零除或索引超出范圍,那么編譯器不會引發關于它的靜態錯誤。

相比之下,動態檢查往往是由特定值引起的錯誤。

原始數據類型不是真正的數字

Java中的一個陷阱 - 以及其他許多編程語言 - 就是它的原始數字類型具有不像我們習慣的整數和實數那樣的特例。
結果,真正應該動態檢查的一些錯誤根本不被檢查。

整數除法:5/2不返回分數,它返回一個截斷的整數。

整數溢出。 如果計算結果過于積極或過于消極而無法適應該有限范圍,則會悄然溢出并返回錯誤答案。 (沒有靜態/動態檢查!)例如,int big = 200000 * 200000;

浮點類型中的特殊值。 NaN(“不是數字”),POSITIVE_INFINITY和NEGATIVE_INFINITY。 例如,double a = 7/0;

4可變性和不變性

賦值

使用“=”給變量賦值
賦值可以和變量聲明結合使用

更改變量或其值

改變變量和改變數值有什么區別?

當你分配給變量時,你正在改變變量的箭頭指向的地方。 您可以將其指向不同的值。

當分配給可變值的內容時(例如數組或列表),您將在該值內改變引用。

變化是必要的罪惡。
好的程序員可以避免變化的事情,因為它們可能會意外地改變。

不變性

不變性是一個主要的設計原則。
不可變類型是一種類型,它們的值一旦創建就永遠不會改變。
Java也為我們提供了不可變的引用:一次賦值且永不重新賦值的變量。

為了使引用不可變,用關鍵字final聲明它。

如果Java編譯器不確定最終變量只會在運行時分配一次,那么它將產生編譯器錯誤。 所以最終給你靜態檢查不可變引用。

最好使用final來聲明方法的參數和盡可能多的局部變量。
像變量的類型一樣,這些聲明是重要的文檔,對代碼讀者很有用,并由編譯器進行靜態檢查。
注意:

fianl的類聲明意味著它不能被繼承。

final變量意味著它始終包含相同的值/參考,但不能最終更改

final方法意味著它不能被子類覆蓋

可變性和不變性

對象是不可變的:一旦創建,它們總是表示相同的值。
對象是可變的:它們具有改變對象值的方法。

字符串作為不可變類型

字符串是不可變類型的一個例子。
一個String對象總是表示相同的字符串。
由于String是不可變的,一旦創建,String對象始終具有相同的值。
要將某些內容添加到字符串的末尾,您必須創建一個新的String對象:

StringBuilder作為一個可變類型

StringBuilder是一個可變類型的例子。
它具有刪除字符串部分,插入或替換字符等的方法
該類具有更改對象值的方法,而不僅僅是返回新值:

可變類型的優點

使用不可變的字符串,這會產生大量的臨時副本

獲得良好的性能是我們使用可變對象的一個原因。

另一個是方便共享:通過共享一個常見的可變數據結構,您的程序的兩個部分可以更方便地進行通信。
“全局變量”
但是你必須知道全局變量的缺點......

5快照圖作為Code-level,Run-time,Moment視圖

快照圖

為了理解微妙的問題,我們可以繪制運行時發生的事情的圖片。
快照圖在運行時表示程序的內部狀態 - 其堆棧(正在進行的方法及其局部變量)及其堆(當前存在的對象)。
為什么我們使用快照圖表?

通過圖片相互交流。

為了說明基本類型與對象類型,不可變值與不可變引用,指針別名,堆棧與堆,抽象與具體表示等概念。

幫助解釋您的團隊項目設計(彼此之間以及與您的技術援助相關)。

為后續課程中豐富的設計符號鋪平道路。

可變值與重新分配變量

快照圖給我們提供了一種可視化更改變量和更改值之間區別的方法:

當您分配給變量或字段時,您將更改變量的箭頭指向的位置。 您可以將其指向不同的值。

當分配給可變值的內容時(例如數組或列表),您將在該值內改變引用。

快照圖中的基本類型和對象類型

基本類型的值

基本類型的值由裸常量表示。 傳入的箭頭是對來自變量或對象字段的值的引用。

對象類型的值

對象類型的值是由其類型標記的圓。

當我們想要顯示更多細節時,我們在其中寫入字段名稱,箭頭指向它們的值。 有關更詳細的信息,這些字段可以包含它們的聲明類型。

重新分配和不可變的值

例如,如果我們有一個字符串變量s,我們可以將其從“a”值重新分配給“ab”
String s =“a”;
s = s +“b”;?
字符串是不可變類型的一個例子,一種類型的值一旦創建就永遠不會改變。?
不變對象(它們的設計者打算始終表示相同的值)在快照圖中用雙邊框表示,就像我們圖中的String對象一樣。

可變的值

相比之下,StringBuilder(一個內置的Java類)是一個可變對象,表示一串字符,并且它具有更改對象值的方法:
StringBuilder sb = new StringBuilder(“a”);
sb.append( “B”);
這兩個快照圖看起來非常不同,這是很好的:可變性和不可變性之間的差異將在使代碼免受bug影響方面發揮重要作用。

不變的引用

Java也為我們提供了不可變的引用:一次賦值且永不重新賦值的變量。 為了使引用不可變,用關鍵字final聲明它:
final int n = 5;
如果Java編譯器不確定最終變量只會在運行時分配一次,那么它將產生編譯器錯誤。 所以最終給出了對不可變引用的靜態檢查。
在快照圖中,不可變引用(final)由雙箭頭表示。

6復雜的數據類型:數組和集合

數組

數組是另一個類型T的固定長度序列。例如,下面是如何聲明一個數組變量并構造一個數組值以分配給它:
int [] a = new int [100];
int []數組類型包含所有可能的數組值,但是一旦創建了特定的數組值,永遠不會改變其長度。
數組類型的操作包括:

索引:a [2]

賦值:a [2] = 0

長度:a.length

列表

我們使用List類型來代替固定長度的數組。
列表是另一個類型T的可變長度序列。 List list = new ArrayList ();
其部分操作:

索引:list.get(2)

賦值:list.set(2,0)

長度:list.size()

注1:列表是一個接口
注2:列表中的成員必須是一個對象。

集合

Set是零個或多個唯一對象的無序集合。
一個對象不能多次出現在一個集合中。 要么它在或它不在。

s1.contains(e)測試集合是否包含元素

s1.containsAll(s2)測試是否s1?s2

s1.removeAll(s2)從s1移除s2

Set是一個抽象接口

地圖

地圖類似于字典(key)

map.put(key,val)添加映射key→val

map.get(key)獲取一個key的值

map.containsKey(key)測試地圖是否有key

map.remove(key)刪除映射

地圖是一個抽象界面

聲明List,Set和Map變量

使用Java集合,我們可以限制集合中包含的對象的類型。
當我們添加一個項目時,編譯器可以執行靜態檢查,以確保我們只添加適當類型的項目。
然后,當我們取出一個對象時,我們保證它的類型將是我們所期望的。

創建List,Set和Map變量

Java有助于區分

一種類型的規范 - 它有什么作用? 抽象接口 - 實現

代碼是什么? 具體類

List,Set和Map都是接口:

他們定義了這些相應的類型是如何工作的,但他們不提供實現代碼。

優點:用戶有權在不同情況下選擇不同的實施方式。

List,Set和Map的實現:

列表:ArrayList和LinkedList

集合:HashSet

地圖:HashMap

迭代器是一個可變類型的迭代器

迭代器是一個對象,它遍歷一組元素并逐個返回元素。
當你使用for(...:...)循環遍歷一個List或數組時,迭代器在Java中被使用。
迭代器有兩種方法:

next()返回集合中的下一個元素---這是一個可變的方法!

hasNext()測試迭代器是否已到達集合的末尾。

7有用的不可變類型

原始類型和原始包裝都是不可變的。

如果你需要用大數來計算,BigInteger和BigDecimal是不可變的。

不要使用可變日期,根據您需要的計時粒度,使用java.time或java.time.ZonedDateTime中適當的不可變類型。
Java的集合類型(List,Set,Map)的通常實現都是可變的:ArrayList,HashMap等
Collections實用程序類具有獲取這些可變集合的不可修改視圖的方法:

Collections.unmodifiableList

Collections.unmodifiableSet

Collections.unmodifiableMap

可變數據類型的不可變包裝
Java集合類提供了一個有趣的折衷:不可變的包裝器。

Collections.unmodifiableList()需要一個(可變的)List,并且用一個看起來像List的對象封裝它,但是其禁用的mutator - set(),add(),remove()等會拋出異常。 所以你可以構造一個使用mutator的列表,然后用一個不可修改的包裝器來封裝它(并且拋棄你對原始可變列表的引用,并且得到一個不變的列表。

缺點是你在運行時獲得了不變性,但不是在編譯時。

如果你嘗試排序()這個不可修改的列表,Java在編譯時不會發出警告。

你會在運行時得到一個異常。

但這還是比沒有好,所以使用不可修改的列表,地圖和集合可以是降低錯誤風險的一種非常好的方法。

不可修改的包裝

不可修改的包裝器通過攔截所有修改集合并拋出UnsupportedOperationException的操作來取消修改集合的能力。
不可修改的包裝有兩個主要用途,如下所示:

一旦建立一個集合就不可變。 在這種情況下,最好不要保留對后備集合的引用。 這絕對保證了不變性。

允許某些客戶端只讀訪問您的數據結構。 您保留對后備集合的引用,但請分發引用。 這樣,客戶可以看,但不能修改,而你保持完全訪問。

8空引用

空引用
在Java中,對對象和數組的引用也可以采用特殊值Null,這意味著引用不指向對象。 空值是Java類型系統中的一個不幸的漏洞。
基元不能為null,編譯器會拒絕這種帶有靜態錯誤的嘗試:
int size = null; //非法
可以將null分配給任何非原始變量,并且編譯器在編譯時高興地接受這些代碼。 但是你會在運行時遇到錯誤,因為你不能調用任何方法或者使用帶有這些引用之一的任何字段(拋出NullPointerExceptions):
String name = null;
name.length();
int [] points = null;
points.length;
null與空字符串“”或空數組不同。

空引用

非基元和像List這樣的集合的數組可能是非空的,但包含null作為值
只要有人試圖使用集合的內容,這些空值就可能導致錯誤。
空值是麻煩和不安全的,所以你最好建議將它們從你的設計詞匯表中刪除。
空值在參數和返回值中被隱式禁止。

來自Guava(Google)

不小心使用null會導致各種各樣的錯誤。
研究谷歌代碼庫,我們發現像95%的集合不應該有任何空值,并且讓這些快速失敗而不是默默接受空值會對開發人員有所幫助。
另外,null很不明確。
很少有人明白空返回值應該是什么意思 - 例如,Map.get(key)可以返回null,因為map中的值為null,或者該值不在map中。 空可能意味著失敗,可能意味著成功,幾乎意味著任何事情。
使用除null之外的其他內容可以明確您的意思。

總結

靜態類型檢查:

減少錯誤保證安全。 靜態檢查通過在運行時捕獲類型錯誤和其他錯誤來幫助安全。

容易明白。 它有助于理解,因為類型在代碼中已明確說明。

準備改變。 靜態檢查通過識別需要一起更改的其他位置來更容易地更改代碼。 例如,當您更改變量的名稱或類型時,編譯器會立即在使用該變量的所有位置顯示錯誤,并提醒您更新它們。

可變性對于性能和便利性很有用,但它也會通過要求使用對象的代碼在全范圍內表現良好而造成bug的風險,這極大地增加了我們必須做的推理和測試,以確保其正確性。?
確保你了解不可變對象(如String)和不可變引用(如final變量)之間的區別。?
快照圖可以幫助理解。

對象是由快照圖中的圓圈表示的值,而不可變的對象是具有雙邊框的值,表示它永遠不會更改其值。

引用是一個指向對象的指針,用快照圖中的箭頭表示,不可變引用是帶有雙線的箭頭,表示不能將箭頭移動到指向不同的對象。

關鍵的設計原則是不變性:盡可能使用不可變對象和不可變引用。

減少錯誤保證安全。 不可變對象不容易出現鋸齒引起的錯誤。 不可變引用總是指向同一個對象。

容易明白。 因為不可變的對象或引用總是意味著相同的事物,所以代碼讀者推理起來更簡單 - 他們不必追蹤所有代碼以找到可能更改對象或引用的所有位置,因為 它不能改變。

準備好改變。 如果在運行時不能更改對象或引用,那么當程序更改時,不需要修改依賴于該對象或引用的代碼。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71330.html

相關文章

  • 3抽象數據類型ADT面向對象編程OOP3.4面向對象編程OOP

    摘要:抽象數據類型的多個不同表示可以共存于同一個程序中,作為實現接口的不同類。封裝和信息隱藏信息隱藏將精心設計的模塊與不好的模塊區分開來的唯一最重要的因素是其隱藏內部數據和其他模塊的其他實施細節的程度。 大綱 面向對象的標準基本概念:對象,類,屬性,方法和接口OOP的獨特功能 封裝和信息隱藏 繼承和重寫 多態性,子類型和重載 靜態與動態分派 Java中一些重要的Object方法設計好的類面向...

    Heier 評論0 收藏0
  • 3抽象數據類型ADT面向對象編程OOP3.5 ADTOOP中的等價性

    摘要:抽象函數引發的關系是等價關系。所以當且僅當通過調用抽象數據類型的任何操作不能區分它們時,兩個對象是相等的。必須為每個抽象數據類型適當地定義操作。一般來說,在面向對象編程中使用是一種陋習。 大綱 什么是等價性?為什么要討論等價性?三種等價性的方式==與equals()不可變類型的等價性對象契約可變類型的等價性自動包裝和等價性 什么是等價性?為什么要討論等價性? ADT上的相等操作 ADT...

    Fundebug 評論0 收藏0
  • 3抽象數據類型ADT面向對象編程OOP3.2設計規約

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

    mozillazg 評論0 收藏0
  • 軟件構造lab2

    摘要:本次實驗訓練抽象數據類型的設計規約測試,并使用面向對象編程技術實現。改成泛型將函數聲明和調用等修改一下即可調用之前我們實現的一個圖結構實現方法如下讀取文件輸入,識別序列,構建圖結構。 本次實驗訓練抽象數據類型(ADT)的設計、規約、測試,并使用面向對象編程(OOP)技術實現 ADT。 3.1 Poetic Walks建立對ADT的基本印象,比如如何設計一個能夠泛型化的ADT。加深對AF...

    孫吉亮 評論0 收藏0
  • 6:可維護性軟件構建方法 6.2可維護性設計模式

    摘要:抽象工廠模式將具有共同主題的對象工廠分組。對可重用性和可維護性設計模式的高層考慮創造性模式工廠方法模式也稱為虛擬構造器意圖定義一個用于創建對象的接口,但讓子類決定實例化哪個類。 大綱 創造性模式 工廠方法模式創建對象而不指定要創建的確切類。 抽象工廠模式將具有共同主題的對象工廠分組。 Builder模式通過分離構造和表示來構造復雜的對象。 結構模式 Bridge將抽象從其實現中分...

    VioletJack 評論0 收藏0

發表評論

0條評論

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