1. 程式人生 > >java中被fianl修飾的物件型別的成員變數與基本型別的成員變數

java中被fianl修飾的物件型別的成員變數與基本型別的成員變數

被fianl修飾的物件型別的成員變數

final修飾的成員變數,其值是不能改變的(這裡的值指的是物件的引用)。必須進行初始化。另外,在一般情況下建立物件的時候,系統都是對其成員變數進行預設初始化的,一旦被fianl修飾的成員變數是不會被初始化的

public class FinalDemo {
    //宣告物件型別的變數
    final String str;//在編譯時會提示The blank final field str may not have been initialized
    //意思是:fianl修飾的欄位str未被初始化
    public static
void main(String[] args) { } }

初始化的方法有三種
1.直接在變數後直接賦值

final String str = "hello"

2.在構造方法中進行賦值

final String str;
public FinalDemo (){
     str = "hello";
}

3.在程式碼塊中進行賦值

final String str;
{
     str = "hello";
}

PS:如果是在靜態程式碼塊中進行初始化賦值,那麼該成員變必須要被static修飾

驗證被fianl修飾物件型別的成員變數是引用不可變,值可變

public class FinalDemo {
    final StringBuilder str = new StringBuilder("Hello");

    public static void main(String[] args) {
        //建立FinalDemo物件
        FinalDemo demo = new FinalDemo();
        System.out.println("str內容是"+demo.str);
        System.out.println("str的hashCode值是"+demo.str.hashCode());

        //對成員變數str進行追加
demo.str.append(" China"); System.out.println("sb的值是"+demo.str); System.out.println(demo.str+"的hashCode值是"+demo.str.hashCode()); // 輸出結果如下所示 // str內容是Hello // str的hashCode值是1690552137 // sb的值是Hello China // Hello China的hashCode值是1690552137 } }

如上所訴:
可以看出StringBuilder中的內容變了 而所指向的雜湊編碼卻沒發生變化,在Java中每一個物件都有自己獨一無二的雜湊編碼,根據這個編碼就可以找到相關的物件,也就是說,根據這個編碼可以獨一無二地確定這個物件。
因而使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容是可以改變的。

被fianl修飾的基本型別的成員變數

final修飾基本型別的成員變數時,其值是不能被改變的,也是必須進行初始化。

public class FinalDemo {
     final int a = 5;
    public static void main(String[] args) {
        FinalDemo demo = new FinalDemo();
        demo.a = 6;//The final field FinalDemo.a cannot be assigned
        //意思是:無法賦值被fianl修飾的欄位
    }
}

基本資料型別的變數,則其數值一旦在初始化之後便不能改變