@html
Java語言是強類型(strongly typed)語言,強類型包含兩方面的含義:①全部的變量必須先聲明、後使用;②指定類型的變量只能接受類型與之匹配的值。這意味着每一個變量和每一個表達式都有一個在 編譯時就肯定的類型。類型限制了一個變量能被賦的值,限制了一個表達式能夠產生的值,限制了在這 些值上能夠進行的操做,並肯定了這些操做的含義。
強類型語言能夠在編譯時進行更嚴格的語法檢查,從而減小編程錯誤。java
聲明變量的語法很是簡單,只要指定變量的類型和變量名便可:編程
type varName=[初始值];
與變量相對應的是常量。
在 Java 中, 利用關鍵字 final 指示常量。數組
final double CM = 2.54;
關鍵字 final 表示這個變量只能被賦值一次。一旦被賦值以後,就不可以再更改了。習慣上,常量名使用全大寫。編碼
Java語言支持的類型分爲兩類:基本數據類型和引用數據類型。.net
基本類型包括boolean類型和數值類型——數值類型分爲整數類型和浮點類型。 整數類型包括byte、short、 int、long、char;浮點類型包括 float 和 double,char表明字符型,實際上字符型也是一種整數類型,至關於無符號整數類型。設計
引用類型包括類、接口和數組類型。所謂引用數據類型就是對一個對 象的引用,對象包括實例和數組兩種。實際上,引用類型變量就是一個指針,只是Java語言裏再也不使 用指針這個說法。3d
一般所說的整型,實際指的是以下4種類型。指針
int是最經常使用的整數類型,所以在一般狀況下,直接給出一個整數值默認就是int類型。除此以外, 有以下兩種情形必須指出。code
> 若是直接將一個較小的整數值(在byte或short類型的表數範圍內)賦給一個byte或short變量, 系統會自動把這個整數值當成byte或者short類型來處理。
> 若是使用一個巨大的整數值(超出了 int類型的表數範圍)時,Java不會自動把這個整數值當成 long類型來處理。若是但願系統把一個整數值當成long類型來處理,應在這個整數值後增長1 或者L做爲後綴。一般推薦使用L,由於英文字母1很容易跟數字1搞混。
全部數字在計算機底層都是以二進制形式存在的,原碼是直接將一個數值換算成二進制數。但計算機以補碼的形式保存全部的整數。補碼的計算規則:正數的補碼和原碼: 徹底相同,負數的補碼是其反碼加1;反碼是對原碼按位取反,只是最高位(符號位)|保持不變。
字符型一般用於表示單個的字符,字符型值必須使用單引號 ' ' 括起來。Java語言使用16位的 Unicode字符集做爲編碼方式,而Unicode被設計成支持世界上全部書面語言的字符,包括中文字符。
所以Java程序支持各類語言的字符。
字符型值有以下三種表示形式。
轉義字符 | 說 明 | Unicode表示方式 |
---|---|---|
\b | 退格符 | \u0008 |
\n | 換行符 | \u000a |
\r | 回車符 | \u000d |
\t | 製表符 | \u0009 |
" | 雙引號 | \u0022 |
' | 單引號 | \u0027 |
\ | 反斜線 | \u005c |
char類型的變量、值徹底能夠參與加、減、乘、除等數學運算,也能夠比較大小,實際上都是用該字符對應的編碼參與運算。
public class CharTest { public static void main(String[] args) { //直接指定單個字符做爲字符值 char aChar = 'a'; //使用轉義字符來做爲字符值 char enterChar = '\r'; //使用Unicode編碼值來指定字符值 char ch = '\u9999'; //將輸出一個'香'字符 System.out.println(ch); //定義一個,瘋'字符值 char zhong ='瘋'; //直接將一個char變量當成int類型變量使用 int zhongValue = zhong; System.out.println(zhongValue); //直接把一個0-65535範圍內的int整數賦給一個char變量 char c = 97; System.out.println(c); } }
要想弄清 char 類型, 就必須瞭解 Unicode 編碼機制。
計算機中,數據都是以二進制的形式存在的。每個二進制位(bit)有0和1兩種狀態,所以八個二進制位就能夠組合出256種狀態,這被稱爲一個字(byte)。也就是說,一個字節一共能夠用來表示256種不一樣的狀態,每個狀態對應一個符號,就是256個符號,從0000 0000到1111 1111。
上個世紀60年代,美國製定了一套字符編碼,對英語字符與二進制位之間的關係,作了統一規定。這被稱爲 ASCII 碼,一直沿用至今。
ASCII 碼一共規定了128個字符的編碼,好比空格SPACE是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0。
英語用128個符號編碼就夠了,可是用來表示其餘語言,128個符號是不夠的。
因此各個地區和國家採用了不一樣同的編碼。好比西歐語言中的ISO 8859-1 俄羅斯的 KOI-八、 中國的 GB 18030 和 BIG-5 等。
可是,這裏又出現了新的問題。不一樣的國家有不一樣的字母,所以,哪怕它們都使用256個符號的編碼方式,表明的字母卻不同。好比,130在法語編碼中表明瞭é,在希伯來語編碼中卻表明了字母Gimel (ג),在俄語編碼中又會表明另外一個符號。可是無論怎樣,全部這些編碼方式中,0--127表示的符號是同樣的,不同的只是128--255的這一段。
至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個字節只能表示256種符號,確定是不夠的,就必須使用多個字節表達一個符號。好比,簡體中文常見的編碼方式是 GB2312,使用兩個字節表示一個漢字,因此理論上最多能夠表示 256 x 256 = 65536 個符號。
世界上存在着多種編碼方式,同一個二進制數字能夠被解釋成不一樣的符號。所以,要想打開一個文本文件,就必須知道它的編碼方式,不然用錯誤的編碼方式解讀,就會出現亂碼。爲何電子郵件經常出現亂碼?就是由於發信人和收信人使用的編碼方式不同。
設計 Unicode 編碼的目的就是要解決這些問題——將世界上全部的符號歸入其中。在 20 世紀 80 年代開始啓動設計工做時,設計人員認用兩個字節的代碼寬度對世界上各類語言的全部字符進行編碼, 並留有空間留給將來的擴展。在 1991 年發佈了 Unicode 1.0, 當時僅佔用 65 536 個代碼值中不到一半的部分。在設計 Java 時決定採用 16 位的 Unicode 字符集,這樣相比較 8 位字符集的程序序設計語言有是一個很大的改進。
Unicode 只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
隨着互聯網的普及,出現一種統一的編碼方式。UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。其餘實現方式還包括 UTF-16(字符用兩個字節或四個字節表示)和 UTF-32(字符用四個字節表示),不過在互聯網上基本不用。
Java的浮點類型有兩種:float(單精度)和double(雙精度)。Java的浮點類型有固定的表數範圍和字段長度,字段長度和表數範圍與機器無關。Java的浮點數遵循IEEE 754標準,採用二進制數據的科學計數法來表示浮點數,對於float型數值,第1位是符號位,接下來8位表示指數,再接下來的23位表示尾數;對於 double類型數值,第1位也是符號位,接下來的11位表示指數,再接下來的52位表示尾數。
Java語言的浮點數有兩種表示形式。
須要注意的是隻有浮點類型的數值纔可使用科學計數法形式表示。例如,51200是一個int類 型的值,但512E2則是浮點類型的值。
Java語言的浮點類型默認是double類型,若是但願Java把一個浮點類型值當成float類型處理,應 該在這個浮點類型值後緊跟f或F。例如,5.12表明一個double類型的值,佔64位的內存空間;5.12f 或者5.12F才表示一個float類型的值,佔32位的內存空間。固然,也能夠在一個浮點數後添加d或D 後綴,強制指定是double類型,但一般不必。
boolean類型,用於表示邏輯上的「真」或「假」。在Java語言中,boolean類型的數值只能是true或false,不能用0或者非0來表明。其餘基本數據類型的值也不能轉換成boolean類型。
Java規範並無強制指定boolean類型的變量所佔用的內存空間。雖然boolean類型的變量或值只要1位便可保存,但因爲大部分計算機在分配內存時容許分配的最小內存單元是字節(8位),所以boolean大部分時候佔8位。
在Java程序中,不一樣的基本類型的值常常須要進行相互轉換。Java語言所提供的7種數值類型之 間能夠相互轉換,有兩種類型轉換方式:自動類型轉換和強制類型轉換。
Java全部的數值型變量能夠相互轉換,若是系統支持把某種基本類型的值直接賦給另外一種基本類型 的變量,則這種方式被稱爲自動類型轉換。當把一個表數範圍小的數值或變量直接賦給另外一個表數範圍 大的變量時,系統將能夠進行自動類型轉換;不然就須要強制轉換。
表數範圍小的能夠向表數範圍大的進行自動類型轉換:
public class AutoConversion { public static void main(String[] args) { int a = 6; // int類型能夠自動轉換爲float類型 float f = a; //下面將輸出6.0 System.out.println(f); //定義一個byte類型的整數變量 byte b = 9; //下面代碼將出錯,byte類型不能自動類型轉換爲char類型 // char c = b; // byte類型變量能夠自動類型轉換爲double類型 double d = b; //下面將輸出9.0 System.out.println(d); } }
表數範圍小的能夠向表數範圍大的進行自動類型轉換,反之則須要經過強制類型轉換( cast) 實現。強制類型轉換的語法格式是在圓括號中給出想要轉換的目標類型,後面緊跟待轉換的變量名。
public class NarrowConversion { public static void main(String[] args) { int iValue = 233; //強制把一個比七類型的值轉換爲byte類型的值 byte bValue = (byte)iValue; //將輸出-23 System.out.println(bValue); double dValue = 3.98; //強制把一個double類型的值轉換爲int類型的值 int tol = (int)dValue; //將輸出3 System.out.println(tol); } }
當強制類型轉換的志而又超出了目標類型的表示範圍,就會出現數值丟失的狀況。
參考:
【1】:《Java核心技術 卷一》
【2】:《瘋狂Java講義》
【3】:http://blog.itmyhome.com/2015/03/java-study-notes-datatype
【4】:https://www.runoob.com/java/java-basic-datatypes.html
【5】:https://blog.csdn.net/Deft_MKJing/article/details/79460485 【6】:《計算機組成原理》