首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 核心基礎概念深度解析:初始化順序、String 池、傳遞機制、final 三部曲

     編輯:Java 程式設計入門

一、類初始化順序:從父到子、從靜態到實例

程式碼驗證


class Parent {
    static { System.out.println("父類-靜態塊"); }
    { System.out.println("父類-初始化塊"); }
    public Parent() { System.out.println("父類-構造函數"); }
}
class Child extends Parent {
    static { System.out.println("子類-靜態塊"); }
    { System.out.println("子類-初始化塊"); }
    public Child() { System.out.println("子類-構造函數"); }
}
new Child();

輸出順序


父類-靜態塊
子類-靜態塊
父類-初始化塊
父類-構造函數
子類-初始化塊
子類-構造函數

完整順序口訣

  1. 父類靜態變量/靜態塊(按代碼順序)
  2. 子類靜態變量/靜態塊
  3. 父類實例變量/初始化塊
  4. 父類構造函數
  5. 子類實例變量/初始化塊
  6. 子類構造函數

關鍵: 靜態內容類載入時執行(一次),實例內容每 new 執行一次。

二、String 存儲結構與字符串池

雙重存儲


String a = "abc";
// 棧:引用變量 a
// 堆:String 物件(含 char[] value)
// 字符串池(方法區/堆):"abc" 常量

經典面試題解析


String v1 = "ab";
String v2 = "ab";           // true (池中同一物件)
String v3 = new String("ab"); // false (堆中新物件)
String v4 = "abcd";
String v5 = "ab" + "cd";    // true (編譯期常量折疊)
String v6 = v1 + "cd";      // false (運行期 new StringBuilder)
String v7 = CONST + "cd";   // true (CONST 為 compile-time constant)
String v8 = staticVar + "cd"; // false (運行期賦值)
String v9 = v4.intern();    // true (手動入池)

核心結論

  • JVM 僅緩存編譯期可確定的常量(final + 常量表達式)
  • new String() 強制在堆建立新物件,不入池
  • intern() 手動將物件放入池/取得池中引用
  • 享元模式應用: String 池是享元模式經典實例,節省記憶體

三、參數傳遞:值傳遞鐵律

鐵律

Java 只有值傳遞。基本型傳值副本,引用型傳引用的副本(指向同一堆物件)。

代碼驗證


void change(int v) { v = 10; }
void change(Obj o) { o = new Obj(); o.val = 10; } // 修改局部引用指向
void add(Obj o) { o.val += 10; } // 修改物件內容

int v = 0; change(v); // v 仍為 0
Obj obj = new Obj(); change(obj); // obj.val 仍為 0
add(obj); // obj.val 變為 10

本質: 傳遞的是棧中的內容(基本值或引用位址),JVM 複製一份給方法參數。

四、final / finally / finalize 三兄弟

關鍵字用途關鍵規則
final修飾類/方法/變量/參數類不可繼承、方法不可重寫、變量只能賦值一次(聲明/初始化塊/構造函數)
finallytry-catch-finally無論是否異常/return/break/continue 必執行,用於資源釋放
finalizeObject 方法GC 回收前調用,不保證執行,Java 9+ 已棄用,改用 Cleaner/PhantomReference

finally 執行保證演示


try { throw new RuntimeException(); } 
catch (Exception e) { } 
finally { System.out.println("必執行"); } // 輸出

try { return "ok"; } 
finally { System.out.println("return 前執行"); } // 輸出

for (int i=0; i<3; i++) {
    try { if (i==2) break; }
    finally { System.out.println("break 也執行"); } // 每次循環都執行
}

五、基本類型完整檔案

類型位數包裝類最小值最大值
byte8Byte-128127
short16Short-32,76832,767
int32Integer-2,147,483,6482,147,483,647
long64Long-9.22e189.22e18
float32Float1.4E-453.4E38
double64Double4.9E-3241.8E308
char16Character065,535
boolean1~8Booleanfalsetrue

無損轉換(自動)

byte → short → int → long → float → double
char → int

可能損失精度(需強制轉型)


int → float, long → float, long → double

六、日期時間兩大支柱

Date(舊 API,多方法已棄用)


Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(date);
Date parsed = sdf.parse("2023-05-20");

Calendar(推薦舊代碼維護用)


Calendar c = Calendar.getInstance();
c.get(Calendar.YEAR);
c.get(Calendar.MONTH); // 0-based!
c.get(Calendar.DATE);
c.get(Calendar.HOUR_OF_DAY); // 24小時制

現代化:java.time (Java 8+)


LocalDateTime.now();
LocalDate.of(2023, 5, 20);
DateTimeFormatter.ofPattern("yyyy-MM-dd");
ChronoUnit.DAYS.between(d1, d2);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved