【軟件構造】第三章第一節 數據類型與類型檢查

第三章第一節 數據類型與類型檢查

  本章將介紹軟件構造的理論基礎——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
    • String:不可變數據類型,在修改時必須建立一個新的String對象
      String s = "a";
      a = s + "b";//s = s.concat("b");
    • StringBuilder:可改變的數據類型,能夠直接修改對象的值

      StringBuilder sb = new StringBuilder("a");
      sb.append("b");

 【可變性與不可變性的優缺點】

  • 可變數據類型最小化的拷貝以提升效率;使用 不可變類型,對其頻繁修改會產生大量的臨時拷貝 (須要垃圾回收 )
  • 可變數據類型,可得到更好的效能;
  • 可變數據類型也適合在多個模塊之間共享數據;
  • 不可變數據類型更安全,更易於理解,也更方便改變;

 【防護性拷貝】

  • 若是一個方法或構造函數容許可變對象進/出,那麼就要考慮一下使用者是否有可能改變它。若是是的話,那你必須對該對象進行保護性拷貝,使進入方法內部的對象是外部時的拷貝而不它自己(由於外部的對象有可能還會被改變)。
  • public Date getEnd() {  
         return new Date(end.getTime());  
    }  //示例請參考 TKD03072010的專欄

     

## 快照圖(Snapshot diagram)

  • 基本類型的值:原始值由裸露的常量表示。傳入箭頭引用變量或對象字段的值
  • 對象類型的值:一個對象值是一個由它的類型標記的圓。當咱們想要顯示更多的細節時,咱們在它裏面寫字段名稱,箭頭指向他們的值。 

  • 不可變對象:用雙線橢圓。

  • 不可變的引用:用雙線箭頭

    • 引用時不可變的,但指向的值能夠是可變的
    • 可變的引用,也可指向不可變的值
相關文章
相關標籤/搜索