1、final修饰变量
- final修饰基本类型:被final修饰的变量复制过后便不能在被修改,一旦修改就报错
(变量标识的空间里保存的就是具体内容,而不是一个地址,所以基本类型不能再改变,一旦改变就是变量本身改变了不符合final关键字) - final修饰引用类型:final修饰引用类型表示该引用指向的对象固定了,但是对象的内容是可以改变的(final实际修饰的是栈上的一个引用值,这个引用代表了对象,只要不将这个引用重新赋给别的对象都不会改变,对象里的内容是可以改变的)
2、final的初始化时机
- 被final修饰额变量只初始化一次
- 在构造方法完毕前(对于非静态的常量,静态的在类加载的时候就已经初始化)
eg:
class Demo{
// int num = 10;
//final int num2 = 20;
int num = 10;
final int num2; //这里num2还没有赋值,所以这里不会报错
{
num2 = 88;//构造代码块先于构造方法,给num2赋值,也不会报错
}
public Demo(){ //由于构造代码块优先于构造方法,此时再次初始化num2就报错
num = 100;
num2 = 200; //无法为最终变量赋值
}
}
class FinalTest2{
public static void mian(String[] args){
Demo d = new Demo();
System.out.println(d.num);
System.out.println(d.num2);
}
}