許多編程語言都有一種方法,告知編譯器某一個數據是恆定不變的,且不能被修改。在java中,達到這一目的正是final關鍵字。被final關鍵字修飾的類,變量,方法意爲“這是不可改變的”。不過,用final修飾基本數據類型和對象,其含義是有所差別的。
具體說來,如果用final修飾基本類型,指的是這一基本類型的數值不可改變,對於基本類型來說,其變量存的就是數值本身,final要求它這個數值一旦初始化了就不能修改。而如果final修飾的是對象類型,則表示的是引用不能被修改,而引用所指向的對象是可以修改的。由於java中的引用正是c語言當中的指針,存放的正是對象的存儲地址,所以final對於引用類型的含義恰是引用變量所存放的存儲地址不能修改,意爲引用不能指向別的對象,而對象本身仍然還是修改。
舉例:
class Dog() {
final int a = 1;
final User user = new User(“張三”);
}
public class MainTest() {
public static void main(String[] args) {
Dog d = new Dog();
d.a = 2; //編譯不通過
d.user = new User(“李四”); //編譯不通過
d.setName(“王五”); //編譯通過
}
}
d.user = new User(“李四”); 這行代碼意圖修改引用的值,所以不被允許;
d.setName(“王五”); 這行代碼修改的是對象本身,引用保持不變,所以允許。