1 使用final修飾的變量必需要給它賦予初始值(也能夠在構造函數中賦予初始值),不然編譯沒法經過。java
2 對於final關鍵字修飾的變量賦予初始值的方法函數
含有final關鍵字修飾的變量,對於其賦值 ,要麼在定義變量的時候賦值,要麼在構造函數中進行構造賦值,不管構造函數入參是什麼,是否有入參,構造器中必須同時包含全部的有final關鍵字修飾的變量並對其進行賦值,不然編譯沒法經過。this
這不是從程序執行的角度來看(程序執行可能用不到類中定義的函數或者變量),而是從程序自己的角度去考慮,考慮這個程序是否有邏輯上的不通,是否能夠在邏輯上被全部能使用這個程序的其餘程序所調用。spa
3 final關鍵字修飾的對象變量是不變的地址值,其中的屬性的值是能夠變,不變的只是對象所在的地址值,只保證對象(地址)不變,不關心對象到底有什麼樣的屬性,或者屬性的值是否會變。code
4 final修飾的變量不能賦值兩次,哪怕兩次賦值的東西是同一個東西,它無論你賦的什麼值,它只關心你只要賦值一次,第二次就不能再進行賦值操做。對象
下面的是具體的例子。get
public class NoteBook { private int num; private String name; public void setNum(int num) { this.num = num; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public String getName() { return name; } }
public class Human { private String name; private final int age; private String address; private final NoteBook notebook; //這幾個構造函數的例子就是說明不管入參是什麼,是否入參,又要對final關鍵字修飾的變量進行初始化; public Human() { age = 120; notebook = new NoteBook(); } public Human(int age, NoteBook notebook) { this.age = age; this.notebook = notebook; } public Human(int xxx1, String xxx2, char xxx3) { age = 580; this.notebook = new NoteBook(); xxx1 ++; this.address = xxx2; } public void setAddress(String address) { this.address = address; } public void setName(String name) { this.name = name; } // public void setNoteBook(NoteBook notebook) { // this.notebook = notebook; // } 由於 notebook是final修飾的,因此不能二次賦值; public int getAge() { return age; } public String getName() { return name; } public String getAddress() { return address; } public NoteBook getNoteBook() { return notebook; } }
public class Test { public static void main(String args[]) { NoteBook notebook = new NoteBook(); notebook.setNum(15); Human human = new Human(599,notebook); System.out.println(human.getAge()); System.out.println(human.getNoteBook().getNum()); notebook.setNum(9999999);//對final修飾的對象變量的屬性進行二次賦值 System.out.println(human.getNoteBook().getNum());//,編譯經過,結果是9999999 } }