final表示不可改变
采用 final 修饰的类不能被继承
public class FinalTest01 {
public static void main(String[] args) {
}
}
final class A1 {
public void test1() {
}
}
//不能继承 A1,因为 A1 采用 final 修饰了
class B1 extends A1 {
public void test2() {
}
}
采用 final 修饰的方法不能被覆盖
public class FinalTest02 {
public static void main(String[] args) {
}
}
class A1 {
public final void test1() {
}
}
class B1 extends A1 {
//覆盖父类的方法,改变其行为
//因为父类的方法是 final 修饰的,所以不能覆盖
public void test1() {
}
public void test2() {
}
}
采用 final 修饰的变量不能被修改
final 修饰的变量必须显示初始化
如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值, 但被指向的对象是可以修改的
构造方法不能被 final 修饰
会影响 JAVA类的初始化:final 定义的静态常量调用时不会执行 java 的类初始化方法, 也就是说不会执行 static 代码块等相关语句,这是由 java 虚拟机规定的。
public class FinalTest03 {
//如果是 final 修饰的变量必须初始化
private static final long CARD_NO = 878778878787878L;
public static void main(String[] args) {
//不能进行修改,因为 CARD_NO 采用 final 修改了
CARD_NO = 99999999999999L;
}
}
public class FinalTest05 {
public static void main(String[] args) {
Person p1 = new Person();
//可以赋值
p1.name = "张三";
System.out.println(p1.name);
final Person p2 = new Person();
p2.name = "李四";
System.out.println(p2.name);
//不能编译通过
//p2 采用 final 修饰,主要限制了 p2 指向堆区中的地址不能修改(也就是p2 只能指向一个对象)
//p2 指向的对象的属性是可以修改的
p2 = new Person();
}
}
class Person {
String name;
}