final 表示不可改变的含义
➢采用 final 修饰的类不能被继承;
➢采用 final 修饰的方法不能被覆盖;
➢采用 final 修饰的变量不能被修改;
➢final 修饰的变量必须显示初始化;
➢如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋 值,但被指向的对象是可以修改的;
➢构造方法不能被 final 修饰;
➢会影响 JAVA 类的初始化:final 定义的静态变量调用时不会执行 java 的类初始化方 法,也就是说不会执行 static 代码块等相关语句,这是由 java 虚拟机规定的。我们 不需要了解的很深,有个概念就可以了。
1、采用 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() {
}
}
2、采用 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() {
}
}
3、采用 final 修饰的变量(基本类型)不能被修改
public class FinalTest03 {
private static final long CARD_NO = 878778878787878L;
public static void main(String[] args) {
//不能进行修改,因为 CARD_NO 采用 final 修改了
CARD_NO = 99999999999999L;
}
}
4、final 修饰的变量必须显示初始化
public class FinalTest04 {
//如果是 final 修饰的变量必须初始化
private static final long CARD_NO = 0L;
public static void main(String[] args) {
int i;
//局部变量必须初始化
//如果不用可以不初始化
System.out.println(i);
}
}
5、final修饰引用
如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值,但被指向的对象是可以修改的。
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;
}