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 } }