Java中的final關鍵字

final關鍵字在Java中指的是"沒法改變的"。它做爲數據,方法和類的修飾符號有以下做用。spa

修飾基本類型

數據以final修飾來告知編譯器這是一塊恆定不變的數據,好比:code

1)一個永不改變的編譯時常量對象

2)一個不但願被改變的運行時初始化的值blog

對於永不改變的編譯時常量,編譯器可能將該常量值直接代入計算式中繼承

final int MAX = 20;

一般使用大寫,多個單詞如下劃線分隔,其效果(不考慮做用域)可類比於c語言中的:作用域

#define MAX 20

與static聯用,該域將佔據一個不能改變的存儲空間。編譯器

static final int MIN = 0;

修飾對象引用

修飾的對象引用不可改變,即一旦引用被初始化指向一個對象,就不能再把它改變指向另外一個對象。一個誤區是,引用的對象自己不能改變。編譯

public class Test {
    public static void main(String args[]){
        final Person s1 = new Person();
        Person s2 = new Person();
        //s1 = s2;   報錯,緣由是s1是final修飾的對象引用
        s2 = s1;   //正確運行
        s1.name = "Sakura";  //正確運行
    }
}

class Person{
    public String name = "sakura";
}

修飾方法

一般來講,修飾方法是爲了把方法鎖定,防止任何繼承類修改它的含義。class

class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

class Student extends Person{
    public void print(){    //報錯,沒法經過編譯
        System.out.printf(name);
    }
}

修飾參數

在方法參數列表中以聲明的方式將參數指定爲final,表明在方法中沒法改變參數指引的對象引用

class Person{
    public void print(final String str){
        str = "sakura";   //沒法經過編譯,去掉final則正常運行
        System.out.println(str);
    }
}

修飾類

將某個類總體定義爲final,即表明該類不能被繼承

final class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

class Student extends Person{  //沒法經過編譯
}

注意,類被final修飾,不表明類中的域被final修飾,類中的域不被final修飾就表明該域能夠被修改;即它的可修改性與類是否有final修飾無關。

public class Test {
    public static void main(String args[]){
        Person s1 = new Person();
        s1.name = "Sakura";   //運行正常
    }
}

final class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

空白final

容許生成空白final,即未給定初值得final域;final修飾類中的某個域時,必須保證該域在定義時初始化或在構造器中被初始化

class Person{
    final String name;
    Person(){
        name = "sakura";
    }
}
相關文章
相關標籤/搜索