1. 程式人生 > >java基礎4:深入理解final關鍵字

java基礎4:深入理解final關鍵字

數據類型 nal contain print ces 修飾 實例 被子 一個

java基礎4:深入理解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修飾類

@Test
public 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修飾方法

@Test
public void final修飾方法() {
Bi bi = new Bi();
bi.go();//該方法無法被子類Ci重寫
?
}

final修飾基本數據類型變量和引用

@Test
public 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基礎4:深入理解final關鍵字