final修饰符
final关键字可以修饰类、变量和方法
final修饰的变量,一旦该变量被赋予初始值,以后则不能改变(即获得初始值之后不能被重新赋值);final可以修饰成员变量(实际变量、类变量)、局部变量、形参。
final成员变量
final修饰的成员变量必须由程序员显示的指定初始值;
final修饰的类变量:必须在静态初始化块中指定初始值或声明该变量时指定初始值,并且只能在其中一个地方指定;
final修饰的实例变量:必须在非静态初始化块中、声明该实例变量的地方和构造器中指定初始值,并且只能在其中一个地方指定;
注:final修饰的实例变量不能在静态初始化中指定初始值,因为静态初始化是静态成员,不能访问非静态成员(实例变量);类变量不能在普通代码块中指定初始值,因为类变量在类初始化阶段已经被初始化,所以在普通代码块中不能被重新赋值。
eg:
public class FinalVariableTest{
//定义成员变量时指定默认值
final int a = 5;
//以下变量将在构造器或代码块中分配初始值
final String str;
final int c;
final static double d;
//既没有在普通代码块中、构造器中,也没有在声明时指定初始值的实例变量也不能在普通方法中指定初始值
final char ch;
//初始化块,对没有指定默认值的实例变量指定初始值
{
//在初始化块中为变量指定初始值
str = "hello";
//a变量已经在声明时指定了初始值,所以重新赋值时,发生错误
//a = 6;
}
//静态初始化块,可以对没有指定默认值的类变量指定初始值
static{
//在静态初始化块中为类变量指定初始值
d = "2.4";
}
//在构造器中对既没有在代码块中,也没有在声明时指定初始值的实例变量指定初始值
public FinalVariableTest{
//在初始化块已经给str指定初始值,所以再次赋值时发生错误
//str = "world";
//既没有在代码块中也没有在声明时指定初始值的实例变量c指定初始值
c = "9";
public void changeFinal{
//普通方法中不能为final修饰的成员变量赋值
//d = 3.5;
//不能在普通方法中为final修饰的成员变量赋值和指定初始值
//ch = 'a';
}
public static void main(String[] args){
FinalVariableTest ft = new FinalVariableTest();
System.out.println(ft.a);
System.out.println(ft.c);
System.out.println(ft.d);
}
}
注:final成员变量在显示初始化之前不能直接访问,但可以通过方法来访问。
final局部变量
若final修饰的局部变量在定义时没有指定默认值,则后面代码中对该变量赋值。若final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。
public class FinalLocalVariableTest{
public void Test(){
//不能对final修饰的形参赋值
//a = 5;
}
public static void main(String[] args){
//定义final局部变量时指定默认值,则str变量无法重新赋值
//final修饰的形参,由于形参在调用该方法时由系统传入的参数来完成初始化,所以final修饰的形参泵被重新赋值
final String str = "hello";
//str = "world";
//定义final局部变量时没有指定默认值,则该变量可以被赋值一次
final double d;
d = 6.7;
}
}
以上整理内容均来自李刚老师的《疯狂Java讲义》