Java學習中的 一些疑惑解答
一、java中的枚舉類型:
在實際編程中,往往存在著這樣的「數據集」,它們的數值在程序中是穩定的,而且「數據集」中的元素是有限的。例如星期一到星期日七個數據元素組成了一周的「數據集」,春夏秋冬四個數據元素組成了四季的「數據集」。在java中如何更好的使用這些「數據集」呢?因此枚舉便派上了用場,下面的一段代碼來說明枚舉類型的特點和用法:
從運行結果來看
(1) 枚舉類型中的元素不是一個對象,枚舉是一個數據集,它的每個具體值都引用一個特定的對象。相同的值則引用同一個對象。
(2) 枚舉類型是一種新的數據類型,並非是原始數據類型
(3) 枚舉類型中的元素可以轉換為字元串類型,並且裡面的所以元素可以列舉出來
二、反碼,補碼,原碼的理解:
在學習原碼, 反碼和補碼之前, 需要先了解機器數和真值的概念。
1、機器數
一個數在計算機中的二進位表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1.
2、真值
因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 {},其最高位1代表負,其真正數值是 -3 而不是形式值131({}轉換成十進位等於131)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
對於一個數, 計算機要使用一定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.
1. 原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因為第一位是符號位, 所以8位二進位數的取值範圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原碼是人腦最容易理解和計算的表示方式.
2. 反碼
反碼的表示方法是:正數的反碼是其本身,負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
[-1] = [{}]原 = [{}]反
可見如果一個反碼錶示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.
3. 補碼
補碼的表示方法是:正數的補碼就是其本身,負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
[-1] = [{}]原 = [{}]反 = [{}]補
對於負數, 補碼錶示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.
三、Java中同名變數的屏蔽原則:
每個變數都有一個「有效」的區域(稱為「作用域」),出了這個區域,變數將不再有效,同名的變數在指定的範圍內有自動屏蔽的原則。即局部變數可以與全局變數同名,在函數內引用這個變數時,會用到同名的局部變數,而不會用到全局變數。下面以一段程序來進行說明:
四、Java中數據類型的轉換規則:
基本數據類型的轉換是指由系統根據轉換規則自動完成,不需要程序員明確地聲明不同數據類型之間的轉換。轉換在編譯器執行,而不是等到運行期再執行。
具體規則:
(1)布爾型和其它基本數據類型之間不能相互轉換;
(2)byte型可以轉換為short、int、long、float和double;
(3)short可轉換為int、long、float和double;
(4)char可轉換為int、long、float和double;
(5)int可轉換為long、float和double;
(6)long可轉換為float和double;
(7)float可轉換為double;
註:(其中除了float類型轉換為double類型為無精度損失,其他類型轉換為double類型都是有精度損失)
也就是說,只能有取值窄的範圍向寬範圍轉換,反之則不行。
五、問題:為什麼double類型的數值進行運算得不到「數學上精確」的結果?
答案:這個涉及到二進位與十進位的轉換問題。N進位可以理解為:數值×基數的冪,例如我們熟悉的十進位數123.4=1×102+2×10+3×(10的0次冪)+4×(10的-1次冪);其它進位的也是同理,例如二進位數11.01=1×2+1×(2的0次冪)+0+1×(2的-2次冪)=十進位的3.25。
double類型的數值佔用64bit,即64個二進位數,除去最高位表示正負符號的位,在最低位上一定會與實際數據存在誤差(除非實際數據恰好是2的n次方)。
舉個例子來說,比如要用4bit來表示小數3.26,從高到低位依次對應2的1,0,-1,-2次冪,根據最上面的分析,應當在二進位數11.01(對應十進位的3.25)和11.10(對應十進位的3.5)之間選擇。
簡單來說就是我們給出的數值,在大多數情況下需要比64bit更多的位數才能準確表示出來(甚至是需要無窮多位),而double類型的數值只有64bit,後面捨去的位數一定會帶來誤差,無法得到「數學上精確」的結果。
六、Java中輸出的加號連接符的使用:
首先看看下面的代碼輸出結果:
輸出結果為:
從輸出結果我們可以看出只有與 」 」 字元串直接相連的後面 「+」 加號才會都被定義成連接符。


※消沉的程序員 系列漫畫之憤怒的代碼
※環境變數path配置,夢開始的地方
※淺談代碼的定位
※Java多態對象的類型轉換
※Java開發之Java對數組的複製
TAG:java學習吧 |
※關於Pinterest的眾多問題,我們一 一解答
※眾 Avengers 解答最多影迷 Google 搜索的 Marvel 疑問
※初學者入門Python常見的疑惑及解答!
※「active」在腦積水新定義中問題的解答
※Eureka常見問題解答
※New Balance 出的這道算術題應該如何完美解答?
※Smartshare用區塊鏈解答「共享」難題
※國際滑聯總監Josh Friedberg,深入解答滑板進奧運的疑惑
※關於谷歌Stadia,產品總監最近解答了幾個疑問
※vivo NEX雙屏版評測:這是vivo對智能手機的另一種解答
※Redmi Note 7 Pro評測:針對網友提出的問題一一作出解答!
※關於亞馬遜打假項目Project Zero的常見問題解答
※三星Galaxy Fold為何不向外摺疊?官方解答來了
※粉絲提問:女生適合穿哪幾款老爹鞋? SneakerBeauty正妹為你解答!
※iPhone XR 名稱意義?Apple 官方解答
※最終幻想15steam版本購買相關問題解答
※oversize西裝怎麼搭?Gigi用這款牛仔褲完美解答!
※美國拍賣平台Tophatter,新賣家常見問題解答
※後台粉絲提問大解答!你想知道的reebonz問題都在這裡
※G?知 最多人在搜尋關於美妝的問題,由Chanel全球創意總監為你解答!