final關鍵字淺析

final變量

(1)一個永不改變的編譯時常量
(2)一個運行時被初始化的值,而你不但願被改變
賦值的方式:
(1)聲明變量時直接賦值
(2)非靜態成員變量在{}塊中賦值,靜態成員變量在static{}塊中賦值
(3)非靜態成員變量在構造方法中賦值

final類

final類不能被繼承,因此沒有子類

final方法

final修飾的方法不能被覆蓋
private方法都是隱式指定爲final的,能夠對private方法添加final修飾詞,但這並不能給改方法增長任何額外的意義

final和static

(1)static對象和代碼段初始化是類加載的時候,類的代碼初始化是實例化的時候(建立第一個對象的時候)
(2)static修飾的變量在內存中只有一個副本,final修飾的變量表示變量不可變
(3)一個既是static又是final的域只佔據一段不能改變的內存空間
public class Insect {
    private int i = 9;
    protected int j;
    Insect(){
        System.out.println("i = " + i + "   j= " + j );
        j = 10;
    }

    private static int x1 = printInit("static insect.x1 initialized");

    static int printInit(String s){
        System.out.println(s);
        return 47;
    }
}

class Beetle extends Insect{
    private int k = printInit("Beetle.k initialized");
    public Beetle(){
        System.out.println("k=" + k);
        System.out.println("j=" + j);
    }
    private static int x2 = printInit("static insect.x2 initialized");

    public static void main(String[] args) {
        System.out.println("Better constructor");
        Beetle b = new Beetle();
    }

}
//結果
static insect.x1 initialized
static insect.x2 initialized
Better constructor
i = 9   j= 0
Beetle.k initialized
k=47
j=10
//final和static
public class StaticFinalTest {
    public static void main(String[] args) {
        RandomNum num1 = new RandomNum();
        RandomNum num2 = new RandomNum();
        System.out.println("final   " + num1.i);
        System.out.println("static  " + num1.j);
        System.out.println("final   " + num2.i);
        System.out.println("static  " + num2.j);
    }
}

class RandomNum {
    public final double i = Math.random();
    public static double j = Math.random();
}
//結果
final   0.5031454567046049
static  0.9587339756327171
final   0.6941988751561768
static  0.9587339756327171

匿名內部類中使用的外部局部變量只能是final變量

緣由:方法中局部變量的生命週期和匿名內部類中聲明週期不同,有可能方法中變量生命週期結束,而匿名內部類中的變量沒有結束。
final字段如何做用:拷貝方法中的局部變量到匿名內部類,這樣的話,匿名內部類中訪問的變量是和外部方法中值相等的另外一個變量。
相關文章
相關標籤/搜索