final String a = "123";
// 报错,无法为最终变量a分配值
a = "abc";
final int b;
// 报错,可能尚未初始化变量b
System.out.println(b);
// final修饰局部变量,在定义时该变量可以不被直接初始化,但是在使用该变量之前,该变量必须完成初始化,否则报错!
final boolean c;
c = true;
System.out.println(c);
final int[] arr = new int[]{1,2,3};
arr[0] = 1;
// 报错 无法为最终变量arr分配值
arr = null;
3、final修饰类
修饰类:这个类没有子类(不能被继承,俗称“断子绝孙类”),但是该类可以有父类,可被实例化
public final class Animal {
}
// 报错,无法从最终Animal进行继承
public class Dog extends Animal{
}
4、final修饰方法
修饰方法:这个方法不能被子类重写
public class Animal {
public final void eat(){
}
}
public class Dog extends Animal{
// Dog中的eat()无法覆盖Animal中的eat()
// 被覆盖的方法为final
public void eat(){
}
}
5、final修饰成员变量
final修饰成员变量:该成员变量必须在其所在类对象创建之前被初始化(且只能被初始化一次)
public class Dog{
// 报错 ,变量 name 未在默认构造器中初始化
public final String name;
}
初始化有三种方式
方式1
直接声明+赋值
public class Dog{
public final String name = "jack";
}
方式2
在构造方法中初始化
public class Dog{
public final String name;
public Dog() {
name = "jack";
}
}
方式3
在构造代码块中将其初始化(赋值)
public class Dog{
public final String name;
{
name = "jack";
System.out.println("构造代码块");
}
public Dog() {
System.out.println("Dog()");
}
}