final
修饰类
表示类不可被继承
修饰方法
表示方法不可被子类覆盖,但可以重载
修饰变量
表示变量一旦被赋值就不可以更改它的值
修饰成员变量
成员变量:是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
如果final修饰的是成员变量 可以在非静态初始化块声明该变量、声明时赋值或者在构造器中执行初始值
类变量:也声明在类中,方法体之外,但必须声明为static类型。
如果final修饰的是类变量 只能在静态初始化块指定初始值 或者 声明该类变量时指定初始值
如下图:
final static int a = 0;//再声明的时候就需要赋值 或者静态代码块赋值
/**
static{
a = 0;
}
*/
final int b = 0;//再声明的时候就需要赋值 或者代码块中赋值 或者构造器赋值
/*{
b = 0;
}*/
修饰局部变量
系统不会为局部变量进⾏初始化,局部变量必须由程序员显示初始化。因此使⽤final修饰局部变量时,
即可以在定义时指定默认值(后⾯的代码不能对变量再赋值),也可以不指定默认值,⽽在后⾯的代码中对final变量赋初值(仅⼀次)
public class FinalVar {
public static void main(String[] args) {
final int localA; //局部变量只声明没有初始化,不会报错,与final⽆关。
localA = 0;//在使⽤之前⼀定要赋值
//localA = 1; 但是不允许第⼆次赋值
}
}
修饰基本类型和引用数据类型
如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能更改;
如果是引⽤类型的变量,则在对其初始化之后便不能再让其指向另⼀个对象。但是引⽤的值是可变
的。
public class FinalReferenceTest{
public static void main(){
final int[] iArr={1,2,3,4};
iArr[2]=-3;//合法
iArr=null;//⾮法,对iArr不能重新赋值
final Person p = new Person(25);
p.setAge(24);//合法
p=null;//⾮法
}
}
finally
就是try catch finally 中 finally修饰的一定会被执行 无论有没有异常
finalize
finalize是java.lang.Object中的方法,也就是每一个对象都有这个方法,一个对象的finalize方法只会调用一次,调用了不一定被回收,因为只有对象被回收的时候才会被回收,就会导致前面调用,后面回收的时候出现问题,不推荐使用