Java中的final修饰符

时间:2022-05-14 21:08:06

(一)final可以修饰变量、方法、类

(二)final修饰的变量

1)被final修饰的变量叫做常量
2)不可变量,即不允许二次修改值。
3)一定要显式地给定初值。
①为什么强调“显式”呢?因为类的实例变量和静态变量在不给初值的情况下,有默认的初始值,例如:int类型的变量的默认初始值为0。但是final修饰的变量必须要显式地给定初值,不然编译出错。
②final变量必须显式给出初值,并且一旦给定,不允许再次修改。

(三)在哪里为final变量赋初值呢?

1)对于实例变量,有3个位置可以赋值。必须要在其中一个位置进行赋值,如果这3个位置都没赋值,编译无法通过。
①声明final变量时直接赋值。示例:final int age=20;(最简单,最常用的方式)
②构造函数中赋值。示例:

public class Demo1 {
final int age;

public Demo1(int age1){
age=age1;//在构造函数中为final变量赋值
}
}

③在非静态代码块中赋值。示例:

public class Demo1 {
final int age;
{
age=20;//在非静态代码块中为final变量赋值
}
}

2)对于静态变量,可以在2个位置进行赋值。可想而知,静态变量不可能在构造函数或者非静态代码块中赋值。
①声明final变量时直接赋值。示例:final static int age=20;(最简单,最常用)
②在静态代码块中赋值。示例:

public class Demo1 {
final static int age;

static{
age=20;//在静态代码块中赋值
}
}

3)对于局部变量,final修饰的局部变量一旦被赋初始值,将不能再次赋值。如下图:
Java中的final修饰符

(四)final修饰的方法

1)final修饰的方法不能重写,用于限制该方法不能被子类重写
2)如果子类和父类在同一个包下,子类无法重写父类的private方法,但是可以重写父类的public、package、protected的方法。除此之外,子类无法重写父类的final方法
3)如果子类和父类不在同一个包下,子类无法重写父类的private、package方法,但是可以重写父类的public、protected的方法。除此之外,子类无法重写父类的final方法
4)final方法不能被子类重写,abstract方法需要被重写,因此final和abstract不能同时修饰一个方法
5)private和final同时修饰某个方法是没有太大意义,但是被Java语法允许。使用public final修饰方法,子类虽不能重写,但是子类能继承并访问该方法。但是使用private final修饰方法,子类既不能重写,又不能访问,显然毫无意义

(五)final修饰的类

1)final修饰的类不能被继承,限制该类被继承
2)final和abstract不能同时修饰某一个类。道理很简单,final不允许继承,abstract需要被继承,二者显然冲突了。如下图:
Java中的final修饰符