Java_final关键字
目录
1、final关键字
1.1 认识final关键字
修饰类
修饰方法
修饰变量
2、final修饰变量的注意
final修饰引用型变量
3、常量
1、final关键字
1.1 认识final关键字
final关键字是最终的意思,可以修饰:类、方法、变量。
- 修饰类:该类被称为最终类,特点是不能被继承了。
- 修饰方法:该方法被称为最终方法,特点是不能被重写了。
- 修饰变量:该变量有且仅能被赋值一次。
修饰类
//1、final修饰类,类不能被继承final class A{}
// class B extends A{} //报错:类B不能继承final类A

那么问题来了,final修饰类用在哪里呢?一般工具类都会用final修饰。
修饰方法
//2、final修饰方法,方法不能被重写
class A{public final void show(){System.out.println("show()");}
}
class B extends A{// 报错:方法不能被重写
// @Override
// public void show(){
// System.out.println("show()");
// }
}

修饰变量
变量有那些呢?
a、成员变量
静态成员变量
静态成员变量
b、局部变量:在方法内的变量
final修饰局部变量
//1、先看局部变量用fianl修饰final int a = 10;
// a = 101 ; //用final修饰的局部变量不能被修改,这里报错
final修饰成员变量.
class Student {//2、定义成员变量//2.1、成员变量用final修饰,定义静态成员变量//在定义静态成员变量的时候一般会把final方法static后面//final修饰静态成员变量,这个变量今后会被称为常量,可以记住一个固定值,并且在程序中不能被修改了,通常这个值作为系统配置信息。//常量的名称建议大写,多个单词用下划线隔开public static final String SCHOOL_NAME = "上海大学";//2.2、成员变量用final修饰,定义实例成员变量(通常没有意义)//实例变量是属于对象的。例如下面的NAME使用final修饰之后,所有人的姓名都是张三,并且不能够修改。和现实不符 。所以说实例变量用final修饰,通常没有意义。public final String name = "张三";
}
2、final修饰变量的注意
final修饰基本类型的变量,变量存储的数据不能被改变。
final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
final修饰引用型变量
/*第一行代码 int []arr = new int[]{1,2,3,4}; 创建了一个新的数组对象,并将该数组对象的引用赋值给 arr 变量第二行代码 arr = new int[]{1,2,3,4,5}; 创建了另一个新的数组对象,并将这个新数组对象的引用重新赋值给 arr 变量*///代码1:int []arr = new int[]{1,2,3,4};arr = new int[]{1,2,3,4,5};final int []arr1 = new int[]{1,2,3,4};//arr1 = new int[]{1,2,3,4,5}; //报错 原因是final修饰引用类型的变量变量的地址不能被改变,但是这里new 创建的数组对象,地址发生了改变,所以报错arr1[0] = 5; //final修饰的变量地址不可以被修改,地址所指向的内容可以被改变
3、常量
- 使用了 static final修饰的成员变量就被称为常量。
- 作用:常用于记录系统的配置信息。
- 注意:常量名的命名规范:建议使用大写英文单词,多个单词使用下划线连接起来
class Student1{public static final String SCHOOL_NAME = "上海大学";}
常量的使用:比喻在项目中有一个最大组长度,所以的数组长度全部定义成MAX_LANGTH。这里我们就可以使用 static final修饰的成员变量。好处:如果后期发现定义的数组长度不够用就可以直接修改MAX_LENGTH的值,后面使用的所有MAX_LANGTH全都会被修改。如果不适用常量就需要一个一个进行修改。
在开发中会写一个常量包(Constant)里面有成百上千个常量。
Constant类
public class Constant {public static final int MAX_LANGTH = 10;
}
Test类
public class Test2 {public static void main(String[] args) {int []arr1 = new int[Constant.MAX_LANGTH];int []arr2 = new int[Constant.MAX_LANGTH];int []arr3 = new int[Constant.MAX_LANGTH];}
}
使用常量记录系统配置信息的优势、执行原理
- 代码可读性更好、可维护性更好。
- 程序编译后,常量会被“宏替代”:出现常量的地方全部会被替换成其记住的字面量,这样可以保存使用常量和直接用字面量的性能是一样的。
我们看一下反编译文件:看MAX_LANGTH是否被替换为10。

