>[success] # java 類型轉換
Java語言中基本數據類型之間的轉換方式:`自動類型轉換`和`強制類型轉換`
* `自動類型轉換:`主要指從小類型到大類型之間的轉換,就是把一個取值范圍小的數據或者變量,賦值給另一個取值范圍大的變量。此時不需要我們額外寫代碼單獨實現,是程序自動幫我們完成的
1. 取值范圍小的,和取值范圍大的進行運算,小的會先提升為大的,再進行運算(取值范圍`byte short int long float double`)

2. `byte、short、char`三種類型的數據在運算的時候,都會直接先提升為int,然后再進行運算
* `強制類型轉換:`主要指從大類型到小類型之間的轉換把一個取值范圍大的數據或者變量賦值給另一個取值范圍小的變量,語法格式如下:`目標類型 變量名 = (目標類型)源類型變量名`,不建議進行類型強制轉換
>[danger] ##### 自動類型轉換
~~~
public class TypeConversion {
public static void main(String[] args) {
byte b1 = 1; // 一個字節
short s1 = 127; // 兩個字節
s1 = b1; // 兩個字節接受一個字節
// b1 = s1; //一個字節到兩個字節報錯 錯誤: 不兼容的類型: 從short轉換到byte可能會有損失
System.out.println(b1 + "," + s1);
double a = 10;
System.out.println(a); // 10.0 小類型像大類型轉換
byte b = 100;
int c = b; // 可以賦值成功 因byte 小類型轉換大類型int隱式轉換,不需要我們額外寫代碼單獨實現,是可以直接賦值
System.out.println(c); // 100
int d = 1;
long e = 100L;
long f = d + e;
System.out.println(f); // long 類型大于int 因此int轉換為long,最終的結果其實就是兩個long相加,那么最終的result是long類型的。
int g = 10;
long h = 100L;
double i = 20.2;
double j = g + h + i; // double 類型最大最后都會轉換為double
byte k = 10;
byte k2 = 20;
int k3 = k + k2; // byte,short,char類型的變量在參與運算的時候,變量里面的值會直接先提升為int
}
}
~~~
>[danger] ##### 強制類型轉換
```java
public class OperatorDemo2 {
public static void main(String[] args) {
double a = 12.3;
int b = (int) a;
System.out.println(b);//12
}
}
```
* **注意點:強制轉換有可能會導致數據發生錯誤。(數據的精度丟失)**,以下面案例為例結果為 `-6,250`,過程
將`short` 強制轉換為 byte 類型 變成了`-6`,轉換過程首先1個字節等于8位二進制,250轉換位short 類型的二進制位`1111 1010`因為short 是兩個字節補位`0000 0000 1111 1010` 轉換位byte 類型為一個字節從最低位開始算8位二進制`1111 1010`,要記住數字類型首位表示正負,此時`1` 為負數,轉換十進制需要`1111 1010` 減1等到`1111 1001
` 在取反`0000 0110` 在轉換十進制等于`6` 在添加符號因此`250` 轉換byte 為`-6`
~~~
public class VarTest{
public static void main(String[] args){
byte b1 = 1; // 一個字節
short s1 = 250; // 兩個字節
b1 = (byte)s1;
System.out.println(b1+","+s1); // -6,250
}
}
~~~
>[danger] ##### 編譯器優化
* 當 `byte + int` 相加結果還是`int`類型, ` byte + byte \` 相加結果還是`int`類型 ,原因是因為`byte` 類型最大為`127` 往往相加之后很容易超過,因此自動升級為`int`
減法也是一樣的,此時`a-b` 已經是int 類型
~~~
public class VarTest{
public static void main(String[] args){
char a = 1;
char b = 2;
b = b-a; // 錯誤: 不兼容的類型: 從int轉換到char可能會有損失
}
}
~~~
- windows -- 環境變量
- Vscode -- 編寫java
- 初始java
- java -- 關鍵字
- 編寫第一個java程序
- java -- 注釋
- 計算機存儲 -- 進制
- java -- 類型
- java -- 變量
- 數字類型
- 布爾類型
- 字符類型
- 類型轉換
- 雙等比較是什么
- java -- 運算符
- 算數運算符
- 字符串拼接
- 關系/比較運算符
- 自增減運算符
- 邏輯運算符
- 三目運算
- 賦值運算符
- 移位運算符
- 位運算符
- 運算符優先級
- java -- 流程控制語句
- if /else if /if -- 判斷
- switch case分支結構
- for -- 循環
- 用雙重for循環
- while -- 循環
- do while -- 循環
- 案例練習
- java -- 數組
- 數組的存儲
- 數組的增刪改查
- 數組的特點
- 數組案例
- 二維數組
- 數組的工具方法
- java -- 方法
- java -- 方法的重載
- java -- 方法的調用流程
- java -- 類方法傳參注意事項
- java -- 方法練習案例
- 對比 return break continue
- for each循環
- java -- 基礎練習
- java -- 面向對象
- java -- 創建類和對象
- java -- 訪問控制符
- java -- 類成員方法
- java -- 構造方法
- java -- this
- java -- 封裝
- java -- 對象內存圖
- java -- 創建對象案例
- java -- static
- java -- 繼承
- super -- 關鍵字
- java -- 構造塊和靜態代碼塊
- java -- 重寫
- java -- final
- java -- 多態
- java -- 抽象類
- java -- 接口
- 引用類型數據轉換
- 綜合案例
- java -- 內部類
- java -- 回調模式
- java -- 枚舉類型
- java -- switch 使用枚舉
- java -- 枚舉方法使用
- java -- 枚舉類實現接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 遞歸練習
- java -- 設計模式
- 單例模式
- java -- 注解
- java -- 元注解
- Java -- 核心類庫
- java -- 處理字符串
- Java -- String
- String -- 常用方法
- String -- 正則
- Java -- StringBuilder 和 StringBuffer
- 知識點
- Java -- StringJoiner 字符串拼接
- 練習題
- 字符串的總結
- Java -- 包裝類
- Integer
- Double
- Boolean
- Character
- java -- 集合類
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 獲取當前時間戳
- Java -- 異常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法