final可用于修饰类,变量和方法,用final修饰的类,变量,方法不可改变。
final修饰的成员变量不能做第二次赋值,final修饰的成员变量必须有明确的初值,若没有初值程序将编译错误,可以直接在声明该变量的地方赋初值,也可以在(静态)初始化块中赋初值,还可以在构造器中指定初值(类变量不行);final修饰的局部变量可以在后面的代码中赋初值,但也只能赋值一次,而且不能对final修饰的形参赋初值。final修饰的引用类型变量不能重新赋值,但可以改变引用类型变量所引用对象的内容。eg;
class finalVar
{
public int s;
public finalVar(int s) {
this.s = s;
}
public final void var(final String s)//s只能由对象类的对象赋值,自己不嫩为自己赋值
{
System.out.println(s);
}
}
public class finalVariable {
final static int a = 1;
final static int b;
static
{
b =2;//使用静态初始化块初始化变量
}
/*
* final static int c;
* c =3;是错误的//不能先定义final(静态)变量,再赋初值
*/
final double c;
public finalVariable()
{
c = 1.2;//使用构造器初始化变量
}
public static void main(String[] args)
{
final finalVar var = new finalVar(1);
var.s = 2;//改变引用变量所引用对象的值
var.var("引用变量");
}
}
final修饰符可以定义“宏变量”,被final修饰的指定了确定初值的的变量可以近似的看做“宏变量”,这种变换就是"宏替换":eg:
public class finalVar
{
public static void main(String[] args)
{
String str0 = "ab";
String str1 = "a" + "b";
System.out.println("str1 = str0 is " + (str1 == str0));
String str11 = "a";
String str12 = "b";
String str13 = str11 + str12;
System.out.println("str13 = str0 is " + (str13 == str0));
final String str21 = "a";
final String str22 = "b";
final String str23 = str21 + str22;
System.out.println("str23 = str0 is " + (str23 == str0));
}
}
结果为:
str1 = str0 is true
str1 = str0 is false
str1 = str0 is true
str0使常量池缓存“ab”,str1使是变量str1指向常量池中的“ab”,所以str1 = str0,但str13 = str11 + str12;不能使str13指向常量池,所以str13 != str0;str21,str22进行了“宏替换”,可以作为常量,既str23与str1类似。
final修饰的方法不可被重写,可以被重载。
final修饰的类不能有子类,例如java.lang.Math类就不能有子类。
在不可变类中,类实例的实例变量不可改变,因此在创建不可变类时要用到final和private修饰符来修饰成员变量。