java基礎_String型別和char型別、自動型別提升和強制型別轉換
Char:字元型別,用’’『單引號表示』,裡面只能有一個字元或者沒有,表示空字元。在記憶體中佔據兩個位元組,也就是2Byte,也就是16位(16bit)
一、常見的字元型別資料:
a) ’1’,’2’,’3’,’9’,’0’『和int型別的 1,2,3,,,0有什麼區別?-用單引號包圍的就是字元型別,沒有單引號的就是int型別』
b) ’a’,’b’,’c’『和”a”,”b”,”c”有什麼區別?-雙引號包圍是字串,只要是被字串包圍的無論裡面是空、1個、多個數據,都是String型別,都是字串。就像是你吃羊肉串一樣,買的時候上面有很多羊肉串起來,別人問你”你手裡拿的是什麼?“當然說”羊肉串“。當你吃得還剩一片羊肉的時候,別人問你”你手裡拿的是什麼?“當然還是說”羊肉串啊“。當上面的羊肉被你吃完的時候,別人問你”你手裡拿的是什麼?“當然說”羊肉串啊,不過剛剛吃完。。。“』,所以
c) ',’,’\’,’、’,’+’,’-’’*’,’/’等等,就是常見的英文標點符號
d) 常見錯誤:’ab’-----這是既不是字串,也不是字元,沒有這種表示形式
e) 鍵盤的誕生:
a) 計算機並不認識這些字元,但是不能向上世紀60年代那樣,每次讓計算機執行一些東西還要苦逼通過紙條向計算機輸入一些二進位制程式碼段來讓計算機執行吧,這個不是人乾的活還是交給計算機吧。那我們想向計算機輸入什麼呢?當然是我們能看懂的了,當然計算機剛開始美國人發明的,沒辦法,於是他們在想:要是可以向計算機輸入我們日常生活中的符號讓計算機認識就好了(美國人生活中的符號:abcdef.....ABCD.....+-*/........,;
b) 可是呢誰來充當這個翻譯,來主動去查表呢?就像你輸入了一個a,誰來自動轉換成一串二進位制程式碼段呢?
c) 這裡我們忽略了一個重大的問題:你是怎麼輸入a的啊???之前是用紙條向計算機裡面輸入一長段二進位制的。現在你仔細想想,當然你會回答鍵盤啊。啊哈,那我們為甚不讓鍵盤來做這個翻譯者呢!這不就變成了,當我們在鍵盤上面按下a的時候,a的下面是一連串的電路板,它就送進去一連串和a對應的的數字脈衝,送達計算機,計算機吧這些數字脈衝轉換成二進位制,去查那個二進位制——字元表,返現這一連串的二進位制表示的是a,就在螢幕上面顯示a了。當然b按鍵的下面也是一對電路板,一按下去就會向計算機發送一連串和b對應的數字脈衝,也到計算機中轉換成二進位制了,查表,返現是二進位制對應b顯示之
d)
e) 其中參考的表就是傳說的ASCII表
f)
g) 當然這種表通用叫做 :編碼表。老美的就叫做ASCII表,ASCII(American Standard Code for Information Interchange,美國標準資訊交換程式碼)
h) 當然,你說中國人用的表是什麼?GB2312-國標表(儲存6000多個漢字)。這夠嗎不夠啊,因為我們還有少數民族等等,,,,
i) 於是就出現了GBK編碼表,貌似這個可以儲存兩萬多個
j) 前面說了char型別可以儲存兩個位元組嗎?那它可以儲存一個漢字嗎?可以,因為一個漢字在計算機中佔據了兩個位元組,所以一個char型別正好可以存一個漢字
二、下面說的是java中的型別轉換了
a)
b) Char 兩個位元組
c) Int 4個位元組
三、自動型別提升:
i.
這段說的是char型別的ch和int型別的1做加運算,看了一下記憶體圖,發現一個佔了兩個位元組 ,一個佔了四個位元組,怎麼相加,是把int型別的轉換成兩個位元組?還是char型別的轉換為四個位元組呢?
ii. 【現實舉例:A住慣了三星級的賓館,A的老闆住慣五星級的酒店,有一天老闆叫A和他一起去出差,你說兩個人晚上會住在哪一種,公司的行政人員絕對不會委屈老闆的,也不會讓A感覺尷尬的,會自動的定兩張五星級酒店的票的】
iii. 所以在這裡我按照現實來類推,方便理解,char型別會自動轉換為四個位元組,然後再進行加運算。
iv.
之前會有疑問:為什麼輸出的不是a1或者不是01010101001呢?
v. 首先是將ch轉換為四個位元組的int型別的,是系統自動支援的向上轉型的(行政人員自動提升A的住宿的等級),然後查詢’a’在ASCII表中對應的二進位制轉換為十進位制的整數是多少——’a’對應的十進位制的是97,再+1,當然是98了(為甚是十進位制不是二進位制?因為預設輸出顯示是十進位制的,人類好看啊,你要是執行二進位制也行哎)。
vi.會有另外一個疑問:為甚不輸出b呢。因為98對應的也是ASCII表中的b?
1. char型別的'a’———ASCII碼錶———>十進位制的97
2. int型別的97 + 1————————>int 型別的98
3. 我把結果int 型別的 98賦值給的是int型別的 x
4. 你又沒叫我賦值給 char型別,我憑什麼給你顯示b
5. 『就像,老闆沒有說定兩張三星級的賓館,我當然給你五星級的了,要是老闆說了那就是強制轉換為三星級的,,,,,,』
四、下面就說說強制型別轉換
a) 說的不好聽的就是降級了:由佔4個位元組的int——————>向佔據兩個位元組的char轉換
b) 要是改成這樣來寫
c)
編譯下就會出現錯誤:無法解析的編譯問題,就是編譯階段通不過:
d) 下面解釋一下編譯階段和執行階段:編譯檢查語法是否出錯,不進行變數的運算,要是你編譯的時候就進行變數的運算的話,那還要執行階段幹嘛!
e) 【這裡就像是老闆沒有說變成三星級賓館,行政人員打電話去訂三星級的賓館,檢查的說老闆沒說三星級的啊,之前不是都五星級的嗎,不行不通過,除非拿老闆的指示才給訂,這就是犯了編譯錯誤】
f) 要是我就是想轉換成char型別的呢?就是想輸出b呢?程式給的提示是
g)
也就是老闆就是說要住三星級的賓館呢?那就是行政人員得到了老闆的命令指示了,這樣定票的時候給檢查的說:喏,這是老闆的批示,他自己要住三星級賓館的。這時候檢查的就會想,老闆你這要做好吃苦的準備啊,估計住幾天會減幾斤肉 【在編譯器{檢查人員看來},這是int型資料要降低自己精度的節奏啊,也就是可能出現數據損失】
h) 所謂的int的資料損失就是四個位元組的int型別的資料——————>兩個位元組的char型別資料
i)
舉例:65536在int型中經過轉換之後,前面的就沒有了,因此說損失了精度
j)
那麼老闆的批示在程式中是什麼?點選了上面第一個提示後如下:
k)
l) 輸出結果:
m)
n) 現在解釋一下為什麼程式不能自動向下轉換型別,也就是編譯器為什麼不能通過檢查。可以看到
i.
ii.
iii. 為什麼???
iv. 我們知道char型別佔據兩個位元組,能表示的範圍是0~65535((2的16次方)-1)。按照我們的理解:h和1相加的結果是是在98是在char的範圍裡面的,是對應’b’的,為甚檢查不通過呢?為什麼下面的char x1=’a’+1;也是表示的char x1=98;為什麼這個就是可以呢??
v. 問題就出現在所謂的 【編譯器編譯階段不運算】,那你肯定會說了:不運算,他怎麼知道98時在char範圍內的?
1.下面解釋一下:所謂的編譯階段是不執行 包含變數的運算,因為常量的值是確定的了,可是你又會說:我的char x=h+1;裡面的h不是賦值了’a’了嗎??可是在第一個程式碼段之間我是可以加句子的:比如如下效果:
2.
3. 給h賦值了一個char型別的最大值,可以想象下面要是再加1的話,就超出範圍了,下面輸出結果就表示超出char型別的範圍了
4.
5.下面的char x1=’a’+1 不執行運算嗎?這是執行運算的,因為’a’是一個常量,在編譯階段是不會再改變的了。你說要是
6. 因此要是表示式中涉及到變數或者是其他全部是比char型別高的常量出現在表示式的右邊的時候,都要加上強制型別轉換
7. 編譯器『訂票的檢查人員』做的事情就是在沒有 明確的強制轉換指令『老闆的批示』情況下,杜絕出現可能出現錯誤『訂三星級賓館的票』