【Java基本功】一文讀懂final關鍵字的用法

程式設計師江湖發表於2019-01-11

【Java基本功】一文讀懂final關鍵字的用法

本文主要介紹了final關鍵字的基本使用方法及原理

final關鍵字可以修飾類、方法和引用。

修飾類,該類不能被繼承。並且這個類的物件在堆中分配記憶體後地址不可變。

修飾方法,方法不能被子類重寫。

修飾引用,引用無法改變,對於基本型別,無法修改值,對於引用,雖然不能修改地址值,但是可以對指向物件的內部進行修改。

比如char[0] = ‘a’。不改變物件記憶體地址,只改變了值。

具體看一下下面的栗子:

final class Fi { 
int a;
final int b = 0;
Integer s;

}class Si{
//一般情況下final修飾的變數一定要被初始化。 //只有下面這種情況例外,要求該變數必須在構造方法中被初始化。 //並且不能有空引數的構造方法。 //這樣就可以讓每個例項都有一個不同的變數,並且這個變數在每個例項中只會被初始化一次 //於是這個變數在單個例項裡就是常量了。 final int s ;
Si(int s) {
this.s = s;

}
}class Bi {
final int a = 1;
final void go() {
//final修飾方法無法被繼承
}
}class Ci extends Bi {
final int a = 1;
// void go() {// //final修飾方法無法被繼承//
}
}final char[]a = {'a'
};
final int[]b = {1
};
複製程式碼

final修飾類

@Testpublic void final修飾類() { 
//引用沒有被final修飾,所以是可變的。 //final只修飾了Fi型別,即Fi例項化的物件在堆中記憶體地址是不可變的。 //雖然記憶體地址不可變,但是可以對內部的資料做改變。 Fi f = new Fi();
f.a = 1;
System.out.println(f);
f.a = 2;
System.out.println(f);
//改變例項中的值並不改變記憶體地址。 Fi ff = f;
//讓引用指向新的Fi物件,原來的f物件由新的引用ff持有。 //引用的指向改變也不會改變原來物件的地址 f = new Fi();
System.out.println(f);
System.out.println(ff);

}複製程式碼

final修飾方法

@Testpublic void final修飾方法() { 
Bi bi = new Bi();
bi.go();
//該方法無法被子類Ci重寫
}複製程式碼

final修飾基本資料型別變數和引用

@Testpublic void final修飾基本型別變數和引用() { 
final int a = 1;
final int[] b = {1
};
final int[] c = {1
};
// b = c;
報錯 b[0] = 1;
final String aa = "a";
final Fi f = new Fi();
//aa = "b";
報錯 // f = null;
//報錯 f.a = 1;

}複製程式碼

【Java基本功】一文讀懂final關鍵字的用法

來源:https://juejin.im/post/5c38a611e51d4544390b1383

相關文章