《Java架構築基》從Java基礎講起——基本數據類型

1. 基本類型有哪些

Java定義了八種基本數據類型:byte,short,int,long,char,float,double,boolean。

  • 基本數據類型也稱爲簡單類型,這些類型可以分爲四組:
    • 整型。包括byte,short,int,long。用於表示有符號整數。
    • 浮點型。包括float,double。用於表示帶小數位的數字。
    • 字符型。包括char。用於表示字符集中的符號。
    • 布爾型。包括boolean。用於表示true/false值。
  • 開發者可以直接使用這些類型,也可以使用它們來構造數組以及自定義類型。因此,它們形成了所有可以創建的其他類型的基礎。Java在其他方面是完全面向對象的,但基本數據類型並不是面向對象的,這樣設計的原因是爲了效率。將基本數據類型設計爲對象會極大地降低性能。
  • 因爲Java語言的特色其中一個就是具備可移植性,即不管在哪個平臺下運行,一份代碼無需修改就可以直接運行。爲了確保這一點,基本數據類型被定義爲具有明確的範圍和數學行爲,與C和C++這類語言“允許整數的大小隨着執行環境的要求而變化”不同,Java語言的數據類型都具有嚴格定義的範圍。無論在那種平臺下,int總是32位的。雖然嚴格指定基本數據類型的範圍在某些環境下會造成性能損失,但這是爲了實現可移植性而必須付出的。

Java的八種基本類型說明如下所示,其中每一種都有特定的格式和大小 |基本類型|說明|字節數 |:----:|:----:|:----: |byte|字節長度的整數,八位|1個字節 |short|短整數,十六位|2個字節 |int|整數,三十二位|4個字節 |long|長整數,六十四位|8個字節 |float|單精度浮點數,三十二位|4個字節 |double|雙精度浮點數,六十四位|8個字節 |char|Unicode字符|2個字節 |boolean|布爾值|1個字節

2. 字面值有哪些類型

基本類型的字面值有四種子類型:整數字面值,浮點數字面值,字符字面值,布爾字面值

3. 整型數據介紹

3.1 整型數據

Java定義了四種整數類型:byte,short,int,long。所有這些類型都是有符號的、正的整數或者負的整數。Java不支持無符號(正值)的整數。博客 名稱|寬度|範圍 :--:|:--:|:--:| long|64|-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 int|32|-2 147 483 648 ~ 2 147 483 647 short|16|-32 768 ~ 32767 byte|8|-128 ~ 127

當中,最常用的整數類型是int。

  • int類型經常用於控制循環變量和索引數組。對於那些不需要更大範圍的int類型數值的情況,你可能會認爲使用範圍更小的byte和short類型效率會更高,然而事實並非如此。因爲在表達式中使用byte和short值時,當對表達式求值時它們會被提升爲int類型。所以,當需要使用整數時,int通常是最好的選擇。

3.2 整數字面值

整數字面值可以寫爲十進制,十六進制(加前綴0x或0X),八進制(加前綴0),二進制(加前綴0B或0b)

//十進制
int x=10;
//十六進制數,即十進制的32
int y=0x20;
//八進制,即十進制的15
int z=017;
//二進制,即十進制的7
int u=0b0111;

整數字面值用於將值賦給byte,short,int和long類型的變量。所賦值不能超出變量的存儲範圍

  • 例如,以下代碼在IDE中就會提示錯誤,因爲byte的最大值爲127
byte b = 250;
  • 要將一個值賦給long類型時,在數字的後面要加上後綴字母L或l。否則,如下代碼中的整數值其實是被看做是int類型的
long a = 120;
  • 在以下代碼中,就會產生一個錯誤,因爲99999999999超出了int類型的存儲能力。爲了解決這個問題,需要在數字後加上後綴字母L或l
long a = 99999999999;

如果整數字面值太長,可讀性會受到影響。

  • 從Java 7開始,可用在整數字面值中使用下劃線將數字分隔開。
//十進制
int x=1_000_000;
//十六進制數,即十進制的32
int y=0x2_0;
//八進制,即十進制的15
int z=0_17;
//二進制,即十進制的7
int u=0b0_111;

4. 浮點型介紹

4.1 浮點型數據

浮點數也稱爲實數,當計算需要小數精度的表達式時使用。 名稱|寬度|範圍 :--:|:--:|:--:| float|32|1.4e-045 ~ 3.4e+038 double|64|4.9e-324 ~ 1.8e+308

float

  • float類型表示使用32位存儲的單精度數值。在某些處理器上,單精度運行速度更快,並且佔用的空間是雙精度的一半,但是當數值非常大或者非常小時會變得不精確。如果需要小數部分,且精確度要求不高時,就可以考慮使用float類型。

double

  • double類型表示使用64位存儲的雙精度數值。在sin()、cos()和sqrt()這類數學函數中,返回值都是double類型。如果需要在很多次迭代運算中保持精度,或是操作非常大的數值時,double類型是最佳選擇。

4.2 浮點數字面值

浮點數包含以下四個部分

  • 一個整數部分
  • 一個小數點
  • 一個小數部分
  • 一個可選的指數

例如,在1.7e8中,1是整數部分,7是小數部分,8是指數

  • 在float和double類型中,0的整數部分是可選的
  • 例如,0.5可以寫成.5
  • 浮點數字面值加上的後綴字母F或f表明其爲float類型,如果沒有標明,該浮點數字面值將是double類型

5. 字符介紹

5.1 字符型數據

char是用於存儲字符的數據類型。Java的設計初衷是允許程序員編寫在世界範圍內均可使用的語言,因此採用了Unicode標準來表示字符。Unicode定義了一個完全國際化的字符集,能夠表示全部人類語言中的所有字符,爲此需要使用十六位寬度來存儲。char的範圍是0 ~ 65536,沒有負的char值。

對於一些語種,例如英語、德語等,可以使用八位寬度來表示這類語言的字符,使用Unicode在一定程度上會降低效率,但這是爲了在全球獲得可移植性而必須付出的代價。

儘管char被設計爲容納Unicod字符,但也可以用作整數類型,可以對char類型的變量執行算術運算。

5.2 字符字面值

字符字面值是一個Unicode字符,或者是單引號括起來的一個轉義序列

例如

'a'
'b'
'\b' 回退字符
'\n' 換行
'\r' 回車

6. 布爾字面值

布爾類型有兩個值,分別爲true和false。

例如,聲明一個布爾變量bool

boolean bool=true;

7. 基本類型轉換

在涉及處理不同數據類型時,常常需要將一個變量的值賦給另一個變量,這就需要進行類型轉換

默認轉換

  • byte,short,char—int—long—float—double
  • byte,short,char相互之間補轉換,他們參與運算首先轉換爲int類型

強制轉換

  • 格式: 目標類型 變量名 = (目標類型)值或變量名
  • int a = (int) 15.7f;

注意要點

!!!!!!!注意!!!!!!!!
1:在java中,任何一個整數默認爲 int 類型 (1)
2:在java種,任何一個小數,默認爲 double 類型( 1.0)
3:123L 或者 1231 編譯器會將該數當成long類型
4:12.345f 或者12.345F 編譯器會將該數當成float類型

7.1 加寬轉換

當從一種基本類型轉換向另一種基本類型時,如果後者的大小和前者相同或者更大,就叫做加寬轉換

  • 例如,將int(32位)轉爲long(64位)。此時不會有信息丟失的風險,且加寬轉換是隱式發生的,不需要在代碼中任何事情
  • 例如
int a=10;
long b=a;

7.2 收窄轉換

收窄轉換髮生在從一種基本類型轉換爲另一種更小類型的轉換中

  • 例如,從long(64位)到int(32位)。收窄轉換需要顯示調用,用圓括號指定目標類型
long a=10;
int b=(int)a;
  • 如果被轉換的值比目標類型的容量還要大的話,收窄轉換將導致信息丟失
  • 例如,9876543210對int類型來說太大了
long a=9876543210L;
int b=(int)a;
//輸出值是1286608618
System.out.println(b);

8. 表達式中的自動類型提升

除了賦值外,在表達式中也可能會發生類型轉換。在表達式中,中間值要求的精度有時會超出操作數的範圍。博客

例如:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

中間部分 a b 很容易超出byte操作數的範圍。爲了解決這類問題,當對表達式求值時,Java會自動將每個byte,short或char操作數提升爲int類型。這意味着使用int類型而不是byte類型執行子表達式a b。因此,即時a和b都被指定爲byte類型,中間表達式(50 * 40)的結果2000是合法的。

自動類型提升很有用,但有時候會導致難以理解的編譯時錯誤。例如:

byte b=10;
//錯誤
b= b*2;

如上代碼試圖將 10 * 2 的結果(一個完全有效的byte值)保存到byte變量中,但是編譯器卻提示錯誤。當計算表達式的值時,操作數被自動提升爲int類型,所以結果也被提升爲int類型。因此,現在是試圖將一個int類型值轉爲byte變量,如果不使用強制類型轉換,就不能將結果賦給byte變量。

Java定義了幾個應用於表達式的類型提升規則

  • 對於一元操作符來說,如果操作數的類型是byte,short或char,運算結果提升爲int類型
  • 對與二元操作符來說,提升規則是從以下幾條依次選擇一條執行
  • 如果操作數類型均爲byte、short或char,那麼兩個數均轉爲int類型,結果數也將爲int類型
  • 如果操作數包含double類型,那麼另一個操作數也轉爲double,結果數也將爲double類型
  • 如果操作數包含float類型,那麼另一個操作數也轉爲float,結果數也將爲float類型
  • 如果操作數包含long類型,那麼另一個操作數也轉爲long,結果數也將爲long類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章