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

Java 每日一題:final 引用變量重賦值陷阱 (20170221)

     編輯:Java 相關知識

題目代碼


package Feb2017;
public class Ques0221 extends Parent {
    public static void main(String[] args) {
        final Parent p = new Parent("aaa");
        p = new Parent("bbb"); // 編譯錯誤
        p.str = "ccc";
        System.out.println(p.str);
    }
}
class Parent {
    String str;
    public Parent() {}
    public Parent(String s) { str = s; }
}

問題分析

final Parent p 表示**引用不可變**,即 p 不能指向新對象。第 5 行 p = new Parent("bbb") 嘗試改變引用指向,**編譯直接報錯**:variable p might already have been assigned / cannot assign a value to final variable p。

正確理解

  • final 修飾**基本類型**:值不可變
  • final 修飾**引用類型**:引用(地址)不可變,**對象內容可變**
  • 若去掉錯誤行,p.str = "ccc" 合法,輸出 ccc

運行結果

**編譯失敗,無法運行**。

考點總結

  1. final 引用語義:鎖定引用,非鎖定對象
  2. 編譯期錯誤 vs 運行期錯誤區分
  3. 繼承關係 (Ques0221 extends Parent) 與本題無關,屬干擾項
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved