Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境設定
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型性
- Java - 方法重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重 catch 塊
- Java - 巢狀 try 塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 加入執行緒
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - 套接字程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送電子郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing Collectors
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾收集
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API改進
- Java - Stream API改進
- Java - 增強的 @Deprecated 註釋
- Java - CompletableFuture API改進
- Java - 流
- Java - 日期時間API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 自動裝箱和拆箱
Java 自動裝箱
自動裝箱是 Java 編譯器 自動將基本型別值轉換為其 包裝器 對應型別的一種技術。例如,當一個 int 值賦值給一個 Integer 包裝器物件時,編譯器會自動將 int 值轉換為物件,而無需顯式轉換 int 值或呼叫任何 方法 將 int 轉換為 Integer 物件。自動裝箱也稱為裝箱。
// Autoboxing Integer obj = 10; // Explicit casting Integer obj2 = Integer.valueOf(10)
在這兩種情況下,包裝器物件都用 int 值初始化。在第一種情況下,自動裝箱起作用;在第二種情況下,我們顯式地將 int 值轉換為 Integer 包裝器物件。
編譯器在以下情況下使用自動裝箱:
如果將基本型別值作為引數傳遞給期望包裝器類物件的函式。
如果將基本型別值賦給包裝器類型別的變數。
Java 中自動裝箱的示例
在這個例子中,我們建立了一個 Integer 列表,因為 List 只包含物件。現在,在向此列表新增專案時,我們沒有建立任何 Integer 物件,而只是傳遞了基本 int 值。Java 編譯器會自動處理轉換,程式會成功編譯。我們還使用了將 char 基本型別值賦給 Character 物件的另一個例子,它也能正常工作。
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i = 0; i< 10; i++){
// autoboxing by passing as an argument
// int value is converted to Integer
// by compiler during compilation
list.add(i);
}
System.out.println(list);
char c = 'a';
//autoboxing by assigning a char to Character object
Character ch = c;
System.out.println(ch);
}
}
輸出
讓我們在沒有任何 命令列引數 的情況下編譯並執行上述程式,這將產生以下結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a
Java 拆箱
拆箱是自動裝箱的反向操作。Java 編譯器使用拆箱將包裝器物件轉換為其基本型別對應物。例如,當一個 Integer 物件作為引數傳遞給一個方法,但呼叫的方法期望一個 int 變數 時,編譯器會自動將 Integer 物件轉換為 int 值,然後將其傳遞給呼叫的方法。類似地,如果 Java 編譯器將包裝器值賦值給基本型別變數,則會進行拆箱。因此,我們不需要顯式地從包裝器物件中獲取 int 值。
Integer obj = Integer.valueOf(10); // Unboxing int i = obj; // Explicit value deduction i = obj.intValue();
在這兩種情況下,基本型別值都用 int 值初始化。在第一種情況下,拆箱起作用;在第二種情況下,我們顯式地從 Integer 包裝器物件中獲取 int 值。
編譯器在以下情況下使用拆箱:
如果將包裝器類物件作為引數傳遞給期望基本型別值的函式。
如果將包裝器類物件賦給基本型別的變數。
Java 中拆箱的示例
在這個例子中,我們建立了一個Integer物件並用值10初始化它。這個物件被傳遞給abs()方法,該方法期望一個int型,一個原始變數。Java編譯器會自動處理轉換,程式能夠成功編譯。我們還使用了另一種將Integer物件賦值給int變數的情況,這也是可行的。
package com.tutorialspoint;
public class Tester {
public static void main(String[] args) {
Integer integer = Integer.valueOf(-10);
// unboxing by passing as an argument
// Integer object is converted to int
// by compiler during compilation
int i = abs(integer);
System.out.println(i);
//unboxing by assigning an Integer object to int variable
int j = integer;
System.out.println(j);
}
private static int abs(int i){
return (i < 0)? -i: i;
}
}
輸出
讓我們在沒有任何命令列引數的情況下編譯並執行上述程式,這將產生以下結果:
10 -10
原始型別和包裝類物件的對映
| 序號 | 原始型別 | 包裝類 | 獲取值的方法 |
|---|---|---|---|
| 1 | byte | Byte | byteValue() |
| 2 | short | Short | shortValue() |
| 3 | int | Integer | intValue() |
| 4 | long | Long | longValue() |
| 5 | float | Float | floatValue() |
| 6 | double | Double | doubleValue() |
| 7 | char | Character | charValue() |
| 8 | boolean | Boolean | booleanValue() |