public final class Test {
private long position = -1;
public void method() {
position++;
}
}
問題:A 呼叫 method() 後 position 為何值?B 再次呼叫後又為何值?
結論:每次呼叫 method() 後,position 均為 0。
final 修飾類僅表示「不可被繼承」,不影響實例變數的生命週期。new Test() 實例時,position 都會初始化為 -1。method() 時執行 position++,值變為 0。許多初學者誤以為 final class 會讓成員變數「只初始化一次」,實際上 final 對類的語意僅限制繼承關係,實例欄位仍遵循一般物件建構規則。
在 method() 中加入列印:
public void method() {
System.out.println("Before: " + position);
position++;
System.out.println("After: " + position);
}
觀察多次呼叫的輸出,即可釐清實例建立與變數修改的時序。