Java基礎4:代碼塊與代碼加載順序
本文主要介紹了final關鍵字的使用方法及原理
final關鍵字可以修飾類,方法和引用。
修飾類,該類不能夠被繼承。并且這個類的對象在堆中分配內存后地址不可變。
修飾方法,方法不能被子類重寫。
修飾引用,引用無法改變,對于基本類型,無法修改值,對于引用,雖然不能修改地址值,但是可以指向對象的內部進行修改。
比如:char[0]='a'. 不改變對象內存地址,只改變了值。
具體看一下下面的例子:
1 final class Fi{ 2 int a; 3 final int b=0; 4 Integer s; 5 } 6 class Si{ //一般情況下final修飾的變量一定要被初始化。 7 //只有下面這種情況例外,要求該變量必須在構造方法中被初始化。 8 //并且不能有空參數的構造方法。 9 //這樣就可以讓每個實例都有一個不同的變量,并且這個變量在每個實例中只會被初始化一次 10 //于是這個變量在單個實例里就是常量了。 11 final int s ; 12 Si(int s) { 13 this.s = s; 14 } 15 } 16 class Bi { 17 final int a = 1; 18 final void go() { 19 //final修飾方法無法被繼承 20 } 21 } 22 class Ci extends Bi { 23 final int a = 1; 24 // void go() { 25 // //final修飾方法無法被繼承 26 // } 27 } 28 final char[]a = {'a'}; 29 final int[]b = {1};
final修飾類:
1 @Test 2 public void final修飾類() { 3 //引用沒有被final修飾,所以是可變的。 4 //final只修飾了Fi類型,即Fi實例化的對象在堆中內存地址是不可變的。 5 //雖然內存地址不可變,但是可以對內部的數據做改變。 6 Fi f = new Fi(); 7 f.a = 1; 8 System.out.println(f); 9 f.a = 2; 10 System.out.println(f); 11 //改變實例中的值并不改變內存地址。 12 13 Fi ff = f; 14 //讓引用指向新的Fi對象,原來的f對象由新的引用ff持有。 15 //引用的指向改變也不會改變原來對象的地址 16 f = new Fi(); 17 System.out.println(f); 18 System.out.println(ff); 19 }
final修飾方法:
1 @Test 2 public void final修飾方法() { 3 Bi bi = new Bi(); 4 bi.go();//該方法無法被子類Ci重寫 5 6 }
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; }
浙公網安備 33010602011771號