第三章第一節 數據類型與類型檢查
本章將介紹軟件構造的理論基礎——ADT,軟件構造的技術基礎——OOPhtml
Outline
- 數據類型
- 類型檢查
- 可變性與不可變性
- 快照圖(Snapshot diagram)
Notes
##數據類型及其表達

【基本數據類型】(引自 菜鳥教程)java
Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。web
- byte:數據類型是8位、有符號的,以二進制補碼錶示的整數;
- 最小值是 -128(-2^7);最大值是 127(2^7-1);默認值是 0;
- byte 類型用在大型數組中節約空間,主要代替整數,由於 byte 變量佔用的空間只有 int 類型的四分之一;
- short:數據類型是 16 位、有符號的以二進制補碼錶示的整數
- 最小值是 -32768(-2^15);最大值是 32767(2^15 - 1);默認值是 0;
- Short 數據類型也能夠像 byte 那樣節省空間。一個short變量是int型變量所佔空間的二分之一;
- int:數據類型是32位、有符號的以二進制補碼錶示的整數;
- 最小值是(-2^31);最大值是 (2^31 - 1);默認值是0;
- 通常地整型變量默認爲 int 類型;
- long:數據類型是 64 位、有符號的以二進制補碼錶示的整數;
- 最小值是 (-2^63);最大值是 (2^63 -1);默認值是 0L;
- 這種類型主要使用在須要比較大整數的系統上;
- float:數據類型是單精度、32位、符合IEEE 754標準的浮點數;
- float 在儲存大型浮點數組的時候可節省內存空間;
- 默認值是 0.0f;
- double:數據類型是雙精度、64 位、符合IEEE 754標準的浮點數;
- 浮點數的默認類型爲double類型;
- double類型一樣不能表示精確的值,如貨幣;
- 默認值是 0.0d;
- boolean:數據類型表示一位的信息;
- 只有兩個取值:true 和 false;
- 默認值是 false;
- char:是一個單一的 16 位 Unicode 字符
- 最小值是 \u0000(即爲0);最大值是 \uffff(即爲65,535);
- char 數據類型能夠儲存任何字符;例子:char letter = 'A';
【對象數據結構】api
- 對象:對象是類的一個實例,有狀態和行爲。
- 類:類是一個模板,它描述一類對象的行爲和狀態。
- Java做爲一種面嚮對象語言,支持多態、繼承、封裝、抽象、重載等概念(Java教程)
【包裝類】數組
- 對於包裝類說,這些類的用途主要包含兩種:
- 做爲和基本數據類型對應的類類型存在,方便涉及到對象的操做。
- 包含每種基本數據類型的相關屬性如最大值、最小值等,以及相關的操做方法。
- java中有八種基本數據類型對應的封裝類型是:Integer(BigInteger表示一個任意大小的整數),Double ,Long ,Float, Short,Byte,Character,Boolean;
- 包裝類的效率更低,編譯器會自動進行轉換;
- 參考 Java API java.lang
## 類型檢查
Java是一種靜態類型的語言;全部變量的類型在編譯的時候就已經知道了(程序尚未運行),因此編譯器也能夠測出每個表達式的類型。在動態類型語言中(例如Python),這種類型檢查是發生在程序運行的時候。安全
【動態檢查】關於「值」的檢查數據結構
- bug在運行中被發現
- 傾向於檢查特定值纔出發的錯誤
- 動態分析檢查的類型:
- 非法的變量值。例如整型變量x、y,表達式x/y 只有在運行後y爲0纔會報錯,不然就是正確的。
- 非法的返回值。例如最後獲得的返回值沒法用聲明的類型來代表。
- 越界訪問。例如在一個字符串中使用一個負數索引。
- 空指針,使用一個null 對象解引用。
【靜態檢查】:關於「類型」的檢查oracle
- 靜態檢查>>動態檢查>>無檢查
- 在編譯階段發現錯誤,避免將錯誤帶入到運行階段,提升程序的正確性\健壯性
- 靜態分析檢查的類型
- 語法錯誤,例如多餘的標點符號或者錯誤的關鍵詞。即便在動態類型的語言例如Python中也會作這種檢查:若是你有一個多餘的縮進,在運行以前就能發現它。
- 類名\函數名錯誤,例如Math.sine(2) . (應該是 sin )
- 參數數目錯誤,例如 Math.sin(30, 20)
- 參數的型錯誤 Math.sin("30")
- 返回值類型錯誤 ,例如⼀個聲明返回 int 類型函數 return "30」
## 可變性和不可變性
- 改變一個變量:是將該變量指向另外一個值得存儲空間
- 改變一個變量的值:是將該變量當前指向的值的存儲空間中寫入一個新的值
【不變性】(immutability)app
- final 變量能被顯式地初始化而且只能初始化一次。不變數據類型,一旦被建立,值不可修改;
- 基本類型及其封裝對象類型都是不可變的
- 不可變的引用是指一旦指定引用位置後,不可再次指定。
- 若是編譯器不能肯定final變量不會改變,就提示錯誤,這也是靜態類型檢查的一部分
- 注意:
- final類沒法派生子類
- final變量沒法改變值/引用
- final方法沒法被子類重寫
【可變性】(mutability)函數
- 不變對象:一旦被建立,始終指向同個值/引用
- 可變對象:擁有方法以修改本身的值/引用
- Sting與StingBuilder
【可變性與不可變性的優缺點】
- 可變數據類型最小化的拷貝以提升效率;使用 不可變類型,對其頻繁修改會產生大量的臨時拷貝 (須要垃圾回收 )
- 可變數據類型,可得到更好的效能;
- 可變數據類型也適合在多個模塊之間共享數據;
- 不可變數據類型更安全,更易於理解,也更方便改變;
【防護性拷貝】
- 若是一個方法或構造函數容許可變對象進/出,那麼就要考慮一下使用者是否有可能改變它。若是是的話,那你必須對該對象進行保護性拷貝,使進入方法內部的對象是外部時的拷貝而不它自己(由於外部的對象有可能還會被改變)。
-
public Date getEnd() {
return new Date(end.getTime());
} //示例請參考 TKD03072010的專欄
## 快照圖(Snapshot diagram)