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中輸出的加號連接符的使用:
首先看看下面的代碼輸出結果:
輸出結果為:
從輸出結果我們可以看出只有與 」 」 字元串直接相連的後面 「+」 加號才會都被定義成連接符。
※作為一名合格的JAVA程序員需要點亮那些技能樹
※純乾貨分享 Java必備基礎知識點十
※JAVA技巧心得:學Java切忌浮躁!
※2017需求最旺的編程語言
※Java初學者必知:Java語言的11大特點
TAG:java學習吧 |
※關於榮耀Watch Magic的使用初體驗:有一些疑惑和答案
※初學者入門Python常見的疑惑及解答!
※國際滑聯總監Josh Friedberg,深入解答滑板進奧運的疑惑
※卜凡穿貂蔡徐坤脫衣,Justin竟拿第一,范丞丞疑惑你們不愛rap嗎
※CrossFit基礎訓練課一個半月的成果和疑惑
※《Running Man》梁世燦的即興表演,「女友疑惑」爆笑
※YG或為掩蓋Big bang Top吸毒疑惑,指使韓瑞熙出國
※TheShy疑惑打野真那麼難?排位兩連勝後大亂斗獎勵自己:easy
※疑似Galaxy Note 9諜照曝光 指紋識別方式成疑惑
※一位果粉的疑惑:同學會拿出iPhoneXR是不是會被人笑話?
※wifi是什麼?看她疑惑的小表情和語氣!
※解答CRISPR基因編輯疑惑:為何有時無效?
※陳冠希帶女兒重遊日本,見面藤原浩,Alaia一臉疑惑!
※小米Play會是何方神聖?三大分析一解疑惑!
※韓國metoo運動,現職偶像歌手被曝性醜聞疑惑
※The shy無視教練BP,觀眾疑惑為何能壓船長,奇葩出裝讓人看不懂
※老油條NiKo蠱惑冷神加入?兩選手Ins奇妙互動令人疑惑
※只做hiit訓練會分解肌肉嗎?進來帶你解除疑惑
※新iPhone銷量慘淡,庫克疑惑:中國人不再喜歡蘋果了?
※SKT bang首談亞運會:到現在還沒人聯絡我,我很疑惑!