- final:可以修饰类、变量、方法
final类:不能被继承,成员方法不能覆盖。
final方法:不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final修饰的成员变量表示常量,值一旦给定就无法改变。
1.修饰局部变量时,一旦赋值就不能二次改变,修饰基本数据类型时,表示该基本类型的值一旦在初始化后便不能发生变化。
public static void main(String[] args){ //final修饰基本数据类型的局部变量 int num1 = 10; System.out.println("num1 = " + num1); num1 = 100; System.out.println("num1 = " + num1);//输出100 final int num2 = 20; //num2 = 200; //不能二次赋值 final int num3; num3 = 30;//第一次可以 //num3 = 300;} |
2.Final 修饰引用类型:
public static void main(String[] args){ //我们用final修饰了一个集合list,并对集合进行add()操作,执行成功。 final List<Student> list = new ArrayList(); List.add("a");list.add("b"); System.out.println(list.toString); //我们对集合进行变更,执行失败; final List<Student> list1 = new ArrayList(); List1 = new ArrayList(); } |
Final修饰的集合‘list’是一个引用,而这个引用指向了‘list’,在往集合里添加数据的时候,并没有影响到‘list’引用地址。而当我们 list = new ArrayList<>(); 为什么就不可以了呢?修饰引用类型时,则在其初始化后就不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。简单一点,引用的值是一个地址,即地址值不能发生变化。
3.修饰成员变量时, 一旦赋值,不能更改(一定要赋值)
直接赋值
构造方法赋值
构造代码开赋值
public class Student { //2.构造代码块/实例代码块:会在每次构造方法执行之前,执行一次 |
4.final修饰静态变量,就变成一个静态常量
直接赋值
静态代码块赋值
class Animal { public final static int weight = 200;//1.直接赋值 public final static int height; static { //2.静态代码块:会在类加载到内存后执行一次 height = 50; } } |
(2)finally:一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。假如我们打开了一个文件,但在处理文件过程中发生异常,这时文件还没有被关闭,此时就会产生资源回收问题。对此,java提供了一种好的解决方案,那就是finally子句,finally子句中的语句是一定会被执行的,所以我们只要把前面说的文件关闭的语句放在finally子句中无论在读写文件中是否遇到异常退出,文件关闭语句都会执行,保证了资源的合理回收。
(3)finalize:是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾.