1 使用final修饰的变量必须要给它赋予初始值(也可以在构造函数中赋予初始值),否则编译无法通过。
2 对于final关键字修饰的变量赋予初始值的方法
- 直接在定义的时候 final xxx xxx = xxx;
- 构造函数中赋予初始值;
含有final关键字修饰的变量,对于其赋值 ,要么在定义变量的时候赋值,要么在构造函数中进行构造赋值,无论构造函数入参是什么,是否有入参,构造器中必须同时包含所有的有final关键字修饰的变量并对其进行赋值,否则编译无法通过。
这不是从程序执行的角度来看(程序执行可能用不到类中定义的函数或者变量),而是从程序本身的角度去考虑,考虑这个程序是否有逻辑上的不通,是否可以在逻辑上被所有能使用这个程序的其他程序所调用。
3 final关键字修饰的对象变量是不变的地址值,其中的属性的值是可以变,不变的只是对象所在的地址值,只保证对象(地址)不变,不关心对象到底有什么样的属性,或者属性的值是否会变。
4 final修饰的变量不能赋值两次,哪怕两次赋值的东西是同一个东西,它不管你赋的什么值,它只关心你只要赋值一次,第二次就不能再进行赋值操作。
下面的是具体的例子。
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
}
}