java學習----底層原理一

WhiteBol發表於2019-02-14

資料型別

  1. java自帶8種基本型別,4中整型型別,2種浮點型別,1種用於表示Unicode編碼的字元單元的字元型別,和1種用於表示真值的bool型別(這8種基本型別都有自己的隱式初始值)。
  2. long在申請變數時賦值資料後必須加l或L,若不加l且在int的範圍內不會報錯,但系統預設資料型別為int而在執行時再去轉換成long會有一部分效能開銷,而且若超出int的取值範圍則會報錯。(float同理)
  3. 各資料型別取值範圍,正數取值比負數取值範圍少1,這是因為將0算作正數當中。int型別所用4位元組-32位,所以可以表示232次方的資料,但有一位需要表示正負,所以實際資料表示範圍為-231-------231-1。
  4. Int型別為連續的資料,間隔為1,float的資料為跳躍型的資料,並不連續,且其間隔不相等,所以float的資料表示範圍遠遠大於int,但也造成float資料型別精度失真(但在一般領域並不考慮這種精度丟失)。
    float型別,1位符號位,7位階位,後23位為數值位,表示資料時,因小數除2永遠除不盡,所以表示小數的二進位制碼也是無窮無盡,因此計算機為了能夠表示小數,將後續二進位制碼進行了捨棄,造成了精度丟失。詳細請參考float型別轉二進位制碼。

Unicode編碼

在程式設計中,任何字元語言最終都會轉換成編碼形式,以ascii為例 ’表示為\u0027,可以嘗試執行System.out.println(\u0027s’),最終結果為s。(計算機直接識別,即便在編譯器中報錯也可以強行執行)

“=”的實質

資料型別分基本型別和引用型別,基本資料型別的變數名和資料儲存在記憶體的棧中(java虛擬機器開闢的記憶體空間中),引用型別又分類和字串,對於字串來講,若賦值時沒有用new(也就是沒有開闢空間,如String a = “123”)那麼,數值便會存在字串常量池中,棧中記錄池中對應的字串地址,如若不存在則建立此字串(若兩個String變數賦值相同,那麼指向同一個地址),而如果用了new那麼就跟類一樣,在堆中先開闢一片空間後存入資訊,將空間地址存在棧中,因此“=”對於引用型別來講便是將堆/字串常量池中的地址儲存到棧中,對於基本型別來講便是將值一起存入棧中。

static與final

static修飾符會將修飾過的變數或方法放到記憶體的靜態區(靜態區在程式執行時便已經存在,與是否建立類物件無關),在靜態區中的變數時全工程共有的,所以final通常修飾靜態變數,而final也防止內部類在使用變數之前,變數被改掉。

java編譯過程

  1. 語言分類
    託管語言是需要安裝環境後翻譯成c與彙編的語言,如:java,vb,託管語言包括指令碼語言 PS:指令碼語言大多是作業系統自帶環境,可以直接執行的語言,也就是說指令碼語言由作業系統做決定,windows是bat檔案,linux中則是sh檔案。
    非託管語言則是由作業系統直接識別翻譯成機器二進位制碼的語言(也就是說可以不用安裝環境直接用記事本寫,寫完就可以直接執行)
  2. java編譯過程
    底層語言為彙編與c語言 (c先翻譯成彙編,之後轉換成二進位制程式碼)
    通過c與彙編衍生出各式各樣的語言
    Eclipse首先會呼叫java.jdk將編寫好的.java檔案送到.jre翻譯成.class檔案(此class檔案並非類,檔案中的內容為位元組碼)
    後將.class檔案再次翻譯成彙編與c語言,後由作業系統完成轉換機器二進位制碼,執行等工作。

相關文章