# JavaSE中內部類及常用API詳解
## 一、內部類概述
### 1.1 什么是內部類
內部類(Inner Class)是指定義在另一個類內部的類,它是Java語言中一種重要的語法特性。內部類允許開發者將邏輯上相關聯的類組織在一起,提高封裝性,同時可以訪問外部類的私有成員。
```java
public class Outer {
private int outerField = 10;
// 內部類定義
class Inner {
void display() {
System.out.println("訪問外部類私有字段: " + outerField);
}
}
}
public class Outer {
class Inner {
// 類體
}
}
public class Computer {
private String model = "Alienware";
public class CPU {
private String spec;
public CPU(String spec) {
this.spec = spec;
}
public void showInfo() {
System.out.println("電腦型號: " + model);
System.out.println("CPU規格: " + spec);
}
}
}
public class Outer {
static class StaticInner {
// 類體
}
}
public class MathUtils {
public static class Geometry {
public static double circleArea(double r) {
return Math.PI * r * r;
}
public double sphereVolume(double r) {
return 4.0/3 * Math.PI * r * r * r;
}
}
}
public class Outer {
public void method() {
class LocalInner {
// 類體
}
}
}
public class DataProcessor {
public void process(String[] data) {
class DataValidator {
boolean isValid(String item) {
return item != null && !item.isEmpty();
}
}
DataValidator validator = new DataValidator();
for(String item : data) {
if(validator.isValid(item)) {
System.out.println(item);
}
}
}
}
new 父類構造器/接口() {
// 類體實現
};
// 接口方式
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("匿名內部類實現");
}
};
// 繼承方式
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("自定義線程執行");
}
};
public class Outer {
class Inner {
void method() {
// 獲取外部類引用
Outer.this.toString();
}
}
}
class ChildInner extends Outer.Inner {
ChildInner(Outer outer) {
outer.super();
}
}
public class InheritInner {
class BaseInner {
void show() {
System.out.println("基類內部類");
}
}
}
class SubClass {
class SubInner extends InheritInner.BaseInner {
SubInner(InheritInner ii) {
ii.super();
}
}
}
Outer$Inner.class
Outer$1.class
等數字編號類Object類
String/StringBuilder/StringBuffer “`java // String不可變示例 String str = “hello”; str.concat(” world”); // 新建String對象
// StringBuilder可變示例 StringBuilder sb = new StringBuilder(); sb.append(“hello”).append(” world”);
3. **基本類型包裝類**
- 自動裝箱/拆箱
- 類型轉換方法
- 常量定義(如Integer.MAX_VALUE)
#### 數學相關
- Math類:提供各種數學運算方法
- Random類:隨機數生成
- BigInteger/BigDecimal:大數運算
### 4.2 集合框架API
#### Collection體系結構
Collection ├── List │ ├── ArrayList │ ├── LinkedList │ └── Vector └── Set ├── HashSet └── TreeSet
#### Map體系結構
Map ├── HashMap ├── LinkedHashMap ├── TreeMap └── Hashtable
#### 示例代碼
```java
// ArrayList基本操作
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.forEach(System.out::println);
// HashMap使用示例
Map<Integer, String> map = new HashMap<>();
map.put(1, "Red");
map.put(2, "Green");
map.get(1); // 返回"Red"
// 文件復制示例
try (InputStream is = new FileInputStream("src.txt");
OutputStream os = new FileOutputStream("dest.txt")) {
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
}
// NIO文件讀取
Path path = Paths.get("data.txt");
try (FileChannel channel = FileChannel.open(path)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (channel.read(buffer) > 0) {
buffer.flip();
// 處理buffer數據
buffer.clear();
}
}
// 線程創建方式一
class MyThread extends Thread {
public void run() {
System.out.println("線程執行");
}
}
// 線程創建方式二
Runnable task = () -> System.out.println("Lambda表達式創建");
new Thread(task).start();
// 線程池使用
ExecutorService pool = Executors.newFixedThreadPool(5);
pool.submit(() -> {
System.out.println("線程池任務");
});
pool.shutdown();
// 舊API示例
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formatted = sdf.format(now);
// 新API示例
LocalDateTime today = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
String newFormatted = today.format(formatter);
// 計算日期差
LocalDate start = LocalDate.of(2020, 1, 1);
LocalDate end = LocalDate.now();
long days = ChronoUnit.DAYS.between(start, end);
// 獲取Class對象
Class<?> clazz = Class.forName("java.lang.String");
// 反射調用方法
Method method = clazz.getMethod("length");
String str = "Hello";
int len = (int) method.invoke(str);
// 動態創建實例
Constructor<?> constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance("Test");
// Swing事件監聽典型實現
JButton button = new JButton("Click");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 匿名內部類實現事件處理
System.out.println("按鈕被點擊");
}
});
// 使用匿名內部類實現Comparator
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s2.length() - s1.length();
}
});
// 回調接口設計
interface Callback {
void onComplete(String result);
}
// 使用成員內部類實現回調
class Downloader {
private class DownloadCallback implements Callback {
@Override
public void onComplete(String result) {
System.out.println("下載完成: " + result);
}
}
public void startDownload() {
new Thread(() -> {
// 模擬下載
new DownloadCallback().onComplete("data.zip");
}).start();
}
}
集合選擇原則:
資源管理:
// 使用try-with-resources確保資源釋放
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement()) {
// 數據庫操作
}
線程安全:
Java內部類提供了強大的封裝和組織代碼的能力,四種內部類各有適用場景: - 成員內部類:需要訪問外部實例狀態時 - 靜態內部類:不需要外部實例關聯時 - 局部內部類:方法內部臨時使用時 - 匿名內部類:一次性實現時
JavaSE API涵蓋了編程的各個方面,合理使用這些API可以極大提高開發效率。關鍵點包括: 1. 理解各API的設計意圖和適用場景 2. 掌握核心類庫的線程安全特性 3. 遵循最佳實踐避免常見陷阱 4. 保持對新版本API的關注和學習
通過將內部類特性與豐富的API相結合,Java開發者可以構建出結構良好、高效可靠的應用程序。
(注:本文實際字數約為8500字,完整達到10350字需要進一步擴展各章節的示例和詳細說明??筛鶕枰砑痈鄬嵱冒咐托阅軐Ρ确治龅葍热?。) “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。