抽象數據類型(ADT)和面向對象編程(OOP)3.1數據類型和類型檢查
數據類型在編程語言中:
類型是一組值以及可以對這些值進行操作
變量 存儲一個特定類型值的命名位置
基本數據類型: int 限制在±2 ^ 31的範圍內,或者大約為±20億
long 2^63
boolean double char byte float short 在堆棧中只有使用時才存在
對象數據類型:BigInteger表示一個任意大小的整數
String
基本類型是小寫字母,而對象類型以大寫字母開頭
對象引用類型:在堆上,垃圾被收集 類,接口,數組,枚舉,註釋 Classes, interfaces, arrays, enums, annotations 有些是可變的,有些不可變
對象(所有非基元都是對象)
除了Object類的其余類都有父類,通過extends子句指定
如果省略了extends子句則默認為Object
一個類是其所有超級父類的一個實例 - 從它的超類繼承可見的字段和方法 - 可以覆蓋方法來改變它們的行為
基本數據類型的包裝類:
將基本數據類型封裝為對象
Boolean, Integer, Short, Long, Character, Float, Double(主要用在集合上) 效率低,能不用就不用 編譯器自動進行轉換
運算符:+ - * / 括號>乘除>加減
字符串連接(+)
靜態與動態數據類型:
java是一種靜態類型的語言
所有變量的類型在編譯時已知(程序運行之前)
類型檢查
靜態類型檢查:程序進行之前,錯誤自動發現
動態類型檢查:執行代碼時自動發現錯誤
沒有檢查:語言根本無助於您找到錯誤。 你必須親自觀察,否則最終會得到錯誤的答案
靜態捕獲一個bug比動態捕獲它要好,動態捕獲它比根本沒有捕獲它要好
靜態檢查意味著在編譯時檢查錯誤
靜態類型:避免因使用錯誤類型的操作而導致的bug (編程時靜態類型會捕獲這個錯誤,不會等程序執行到該行)
語法錯誤,如額外的標點符號或假詞
錯誤的參數數量 錯誤的參數類型 錯誤的函數返回值類型
動態類型:
靜態檢查往往是關於類型的,與變量具有的特定值無關的錯誤,靜態檢查保證了變量會從集合中獲得一些值,但是直到它運行才知道它具體有哪個值,所以如果錯誤是某些值引起的,比如被0除,索引超出範圍,不會引起編譯器不會引發關於它的靜態錯誤。但是動態檢查往往是特定值的錯誤。
原始類型並不是真正的數字,
可變形和不變性
改變變量是在其指向的地址,盡量避免變化。
不變性
不變數據類型創建完後,值不可更改。不變引用,一旦指定引用位置,不可再次指定。
為了使引用不可變 final
編譯器如果不確定final 變量只在運行時分配一次,會報錯,靜態檢查
最好使用final來聲明方法的參數和盡可能多的局部變量。
final class不能被繼承 final變量它始終包含相同的值/引用,但不能更改 final方法意味著它不能被子類覆蓋
對象是不可變的:一旦創建,它們總是表示相同的值
對象是可變的:它們具有改變對象值的方法
String是不可變類型。一個String對象總是表示相同的字符串 String是不可變的,一旦創建,String對象始終具有相同的值 如果進行改變只能重新創建一個新的對象
StringBuilder是可變的類型 它有刪除部分字符串,插入或替換字符的方法等
只有一個對象的引用時,不變性和可變性區別不大,當對象有其他引用時,它們的行為方式會有很大的差異
可變性的優點
使用不可變的字符串會產生大量的臨時副本,浪費很多的時間。
良好的性能
方便的共享:通過共享一個公共的可變的數據結構,程序的兩部分可以更方便的交流。
全局變量的缺點:
不可變類型從出錯角度考慮更加安全,更加容易理解,且易於更改,易變性使得難以理解你的程序正在做什麽,並且執行合同要困難得多
安全的使用可變類型:局部變量,不會涉及共享;只有一個引用。
如果有多個引用(別名),使用可變類型就非常不安全。
快照圖作為代碼級,運行時和瞬間視圖
對於我們繪制運行時發生的事情的圖片會很有幫助,以便理解微妙的問題,在運行時表示程序的內部狀態 - 它的堆棧(正在進行的方法和它們的局部變量)及其堆(當前存在的對象)
不可變對象:用雙線橢圓。
不可變的引用:用雙線箭頭。
引用是不可變的,但指向的值卻可以是可變的。
可變的引用,也可指向不可變的值。
Java也為我們提供了不可變的引用:一次賦值且永不重新賦值的變量。 為了使引用不可變,用關鍵字final聲明它
數組集合
int[] a = new int[100]; int []數組類型包含所有可能的數組值,但是一旦創建了特定的數組值,永遠不會改變其長度
List代替固定長度的數組 ,類型T的可變長的序列 List<Integer> list = new ArrayList<Integer>(); list.get(i) list.set(i,2) list.size() list.add(2) List是一個接口
List Set Map都是接口
List: ArrayList and LinkedList
Set: HashSet
Map: HashMa
叠代器是一個可變類型,叠代器是一個對象,它遍歷一組元素並逐個返回元素。list.remove()移除某一元素後,後面的元素向前覆蓋
不可變類型的利用:
Java的集合類型(List,Set,Map)的通常實現都是可變的:ArrayList,HashMap等。集合實用程序類具有用於獲得這些可變集合的不可修改視圖的方法:
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
可變性對於性能和便利性非常有用,但它也會通過要求使用對象的代碼在全局級別上良好表現而產生錯誤風險,這極大地增加了我們必須做的推理和測試,以確保其正確性。
對象是由快照圖中的圓圈表示的值,而不可變的對象是具有雙邊框的值,表示它永遠不會更改其值。
引用是指向一個對象的指針,不可變引用是帶有雙線的箭頭,表示該箭頭不能移動以指向不同的對象
抽象數據類型(ADT)和面向對象編程(OOP)3.1數據類型和類型檢查