java中被fianl修飾的物件型別的成員變數與基本型別的成員變數
阿新 • • 發佈:2018-11-29
被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修飾的欄位
}
}
基本資料型別的變數,則其數值一旦在初始化之後便不能改變