閱讀873 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java基本語法-----java數據類型的轉換

前言

Java中可以進行不同數據類型的加減乘除運算嗎?是可以的。在算術運算符中已經體驗過如果兩個整數(int)相除會去掉小數部分。如果需要保留小數部分,可以讓除數或者被除數變為double類型的(5變為5.0)。其實Java是自動的將int的那個數變為了double類型了也就是Java自動的將整數變為了浮點數。例如5/2.0 其實是5.0/2.0。

1、自動類型轉換(也叫隱式類型轉換)

可以將一個數賦值給更大數值範圍的變量,例如可以經byte

變量賦值給short變量可以將short變量賦值給int變量可以將int變量賦值給long變量。

Java內部其實做了工作就是自動將數值進行了類型提升,就叫做自動類型轉換(也叫隱式類型轉換)

 byte b = 1; //00000001

自動類型轉換(也叫隱式類型轉換)

要實現自動類型的轉換,需要滿足兩個條件,第一兩種類型彼此兼容,第二目標類型取

值範圍必須大於源類型。所有的數字類型,包括整形和浮點型彼此都可以進行轉換。

例如:

 byte b=100; int x=b;

如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裏麵有大量的學習資料可以下載。

2、強製類型轉換(也叫顯式類型轉換)

不可以將一個數值賦給範圍更小數值範圍的變量,除非進行類型轉換。

 byte b = 100;

上述例子發生了什麼,發生了類型轉換。 b+2 遇到了加法運算,2默認是int類型,byte類型b變量存儲的值自動類型提升為

了int類型。執行完加法運算後的結果就是int類型,想要將int的類型值放入到byte類型變量b中,無法放入,編譯報錯。

 byte b=1;

當兩種類型彼此不兼容,或者目標類型取值範圍小於源類型(目標是byte源是int) 無法自動轉換,此時就需要進行強製類型轉換。

強製類型轉換需要注意:

損失精度!!!

int a=128; byte b=(byte)a;

int

|00000000 | 00000000 | 00000000 | 10000000 |

再次分析此行代碼

 byte b = 100;

編譯:提示如下錯誤。

1dbe0003237ef1962e1b

3、類型轉換的原理

可以把byte 理解為1兩的碗,short 2兩的碗,int 4兩的碗,long 8兩的碗。1兩碗的滿碗酒可以倒入 2兩 4兩 8兩的碗中。 但是 4兩碗的酒倒入1兩碗的酒就有一些問題。( 別暈 仔細閱讀 多思考)

1、什麼時候要用強製類型轉換

比如小數部分隻想保留整數部分. 一定要清楚要轉換的數據在轉換後數據的範圍內否則會損失精度.

public static void main(String[] args) { byte b = 100;

2、表達式的數據類型自動提升

算術表達式,邏輯表達式 所有的byte型、short型和char的值將被提升到int型。

如果一個操作數是long型,計算結果就是long型; 如果一個操作數是float型,計算結果就是float型;

如果一個操作數是double型,計算結果就是double型。

分析 System.out.println(‘a’+1)結果? 自動類型提升

 byte b = 3; int x = 4;

強製類型轉換

 byte b = 2; /*

思考1

byte b=126;11

既然數據默認的有數據類型,那麼126 默認是int類型的,為什麼存儲到byte類型時不會報錯呢。

126 是常量java在編譯時期會檢查該常量(每個常量)是否超出byte類型的範圍。如果沒有可以賦值。


思考2

byte b=128;

能否正常的編譯和運行。

該語句會出現編譯錯誤,128超出了byte變量的存儲範圍,所以出現編譯錯誤。


思考3

byte b1=3,b2=4,b;

b=b1+b2;

b=3+4;

哪一句編譯失敗?為什麼?

b =3+4, 3和4都是常量,所以java在編譯時期會檢查該常量(每個常量)是否超出byte類型的範圍。如果沒有可以賦值。例如b=128+1 就無法編譯通過。b=127+1;也是無法通過。

b =b1+b2 不可以,因為b1 和b2 是變量,表達式求值時,變量值會自動提升為int型,表達式結果也就成了int型,這是要賦值給byte型的b,必須進行強製類型轉換了。


補充

System.out.println(‘a’+1)結果

美國人為了讓計算機識別他們生活中的文字,讓二進製表示生活中的文字.所以一個字母代表了一個二進製.,二進製也有十進製的表現形式.,把生活中的字母都用數字來標識,例如97代表a ,98 代表 b。打印’a’就把a作為輸出顯示,沒有疑問。但是 ‘a’+1 有加號涉及到了運算。根據java自動類型提升規則,同樣道理 char 提升為int 。就把’a’代表的數字體現了出來。a 表示的是97 ,97+1就是98; 那麼 想要查看98 表示的char 是什麼 怎麼實現呢 ?就要用到剛才介紹的強製類型轉換了System.out.println(char(‘a’+1));就取到了98 在ASCII碼表中表示的字符。大寫A 和小寫a 在 ASCII有不同的表現。還有一個概念字符’1’ 在ASCII中 不是數字 1,可以運行代碼查看,到此就可以明白了char 類型,char類型也是可以參與運算的,為什麼可以參與運算呢。因為字符在ASCII表中都有對應的數字體現。所有的計算機兼容ASCII。

 System.out.println('a'+1); //98

補充問題:

 int i='a'+'b';

總結:

所有數值運算符都可以用在char型數據上,如果另一個操作數是一個數字或者字符,那麼char會自動提升為int型,如果另一個操作數是字符串,那麼字符就會和字符串相連。

最後更新:2017-05-03 12:30:39

  上一篇:go 究竟怎樣的技術才算“有情有義”?
  下一篇:go MySql分區表性能測試及切換案例