1.概述:在java中,final关键字可以用来修饰类,方法和变量,final为最终的意思,通常通过final关键字修饰的变量就变成了常量。
2.final修饰类
使用final关键字修饰类,则该类不能被继承,称为最终类。(即该类不能有任何的子类)
//父类被final关键字修饰
public final class Person {
}
//子类想继承父类Person,编译不通过,报错
class Student extends Person{
}
报错信息: Student类不能成为被final关键字修饰Person类的子类
当你不希望一个类被继承的时候,就可以使用final修饰这个类,这样,该类就不能被任何一个类继承。
3.final修饰方法
final修饰类时,表明类不能被继承,修饰方法时,说明该方法为最终方法,即不能被子类重写。
public class Person {
//未被final关键字修饰的方法,在子类中可以正常被重写
public void shout() {
System.out.println("Person----大喊");
}
//被final关键字修饰的方法,子类中不能被重写
public final void run() {
System.out.println("Person------跑");
}
}
class Student extends Person{
//正常重写父类中未被final关键字修饰的方法
@Override
public void shout() {
System.out.println("Student-------大喊");
}
//重写父类中被final关键字修饰的方法,编译不通过,报错
@Override
public void run() {
System.out.println("Studnet-------跑");
}
}
报错信息:不能重写父类中的final方法
4.final修饰成员变量
final修饰基本数据类型变量,该变量必须初始化,且初始化后不能修改值。
public static void main(String[] args) {
final int a=10;
//变量a重新赋值时,编译不通过
a=100;
}
报错信息: 变量a不能重新赋值
final修饰引用数据类型变量,值可以被修改,但不能重新分配内存空间。
public static void main(String[] args) {
final int[] arr= {1,2,3};
for(int i=0,len=arr.length;i<len;i++) {
//修改数组元素中的值
arr[i]=arr[i]*100;
}
//重新分配内存空间,编译不通过
arr=new int[] {10,20,30};
}
运行结果:
从运行结果中可以看出,被final修饰的引用类型数据变量,值可以被正常修改,但当重新分配内存空间时,编译不通过,报错信息与上面修改基本数据类型值的时候一致。
5.总结
1.final修饰类时,该类为最终类,不能被继承
2.final修饰方法时,该方法为最终方法,不能被子类重写3.final修饰变量时,分为两种情况:
修饰基本数据类型时,变量就会变为常量,值不能被修改
修饰引用数据类型时,元素的值可以修改,但不能给变量重新分配内存空间