這節我們繼續學習數據類型之間的轉換中應該注意到的一些小細節。
數據類型之間的轉換有兩種:
1.自動類型轉換(隱式類型轉換)
2.強制類型轉換(顯式類型轉換)
表達式的數據類型自動提升:
所有的byte型,short型和char型的將自動提升為int型;
如果一個操作數是long型,那么計算結果也是long型;
如果一個操作數是float型,那么計算結果也是float型;
如果一個操作數是double型,那么計算結果也是double型;
我們看出占內存小的自動提升為占內存大的數據類型。
而當我們要把占內存大的數據類型轉換成占內存小的數據類型時必須要強制轉換,當然有可能造成精度降低或溢出,所以在使用時一定要格外注意。
下面我們直接看一段代碼,體驗一下數據轉換中的一些細節。
~~~
class VarDemo2
{
public static void main(String[] args)
{
int x = 3;
x = x + 5;//運算兩端必須同類型,一般情況下不同類型是不能運算的
byte b = 5;
x = x + b;//特殊情況下,兩端為數值型,類型會自動提升,以占用內存比較大的為主,占用內存小的類型自動提升
byte b1 = 3;
//b1 = b1 + 4;//錯誤:不兼容類型:從int轉換成byte可能會有損失.這里的4是int類型的,相加,b1會自動提升,4個字節存儲,不能附值給1個字節的b1
b1 = (byte)(b1 + 4);//強制轉換
System.out.println(b1);
b1 = (byte)(b1 + 200);//強制轉換
System.out.println(b1);
System.out.println('a' + 1);//結果是98,計算機里面全部是二進制,01100001對應a(二進制和生活中文字對應關系表,也就是編碼表,全稱ASCII)
System.out.println((char)('a' + 1));//b
System.out.println('你' + 0);//中文對就的是gb2312或者GBK unicode是國際標準碼表
System.out.println('0' + 0);
byte b2 = 4;//4還是int類型,在附值過程中會自動檢測,并強制轉換類型
b2 = 3 + 7;//這個編譯通過,因為3和7是常量,是確定的,可以自動檢測
byte b3 = 3;
byte b4 = 7;
//b2 = b3 + b4;//這個編譯通不過,因為b1和b2是變量,這兩值不確定,不能自動檢測,報錯說丟失精度
int x0;
int x1 = Integer.MAX_VALUE;//這個是取int范圍的最大值
int x2 = 2;
x0 = x1 + x2;
System.out.println(x0);//超出int范圍
}
}
~~~
結果如下:

從結果我們很清楚的看到不同數據類型之間的轉換結果,以及數據類型的范圍溢出等細節問題,在以后的學習中更加注意。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現