面试题04-final
final
- 修饰类:表示类不可以被继承
- 修饰方法:表示方法不可被子类覆盖
- 修饰变量:表示变量一旦被赋值就不可以更改它的值
(1)修饰成员变量
- 如果final修饰的是类变量(static修饰),只能在静态初始化块中指定初始值或者声明该变量时指定初始值。
- 如果final修饰的时成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初初始值。
(2)修饰局部变量
系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,即可以在定义时指定默认值,也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)
public class Demo {
final static int a = 0;
/*
* final static int a;
* static{
* a = 0;
* }
* */
final int b = 0;
/*
* final int b;
* {
* b = 0
* }
* */
public static void main(String[] args) {
final int local;
local = 1;
}
}
(3)修饰基本类型数据和引用类型数据
- 如果是基本数据类型(byte,short,int,long,float,double,boolean,char)变量,则其数值一旦在初始化之后不能更改
- 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,(但值可以改变)
public static void main(String[] args) {
final int local;
local = 1;
final char[] strArr = {'1','2','3','4'};
char[] strArr1 = {'5','6','7','8'};
strArr[2] = '0';
//strArr = strArr1;
}
为什么局部内部类和匿名内部类只能访问局部final变量
- 内部类和外部类处于同一级别,内部类不会因为定义在方法中随着方法的结束而销毁;
- 当外部类的方法结束时,局部变量就会销毁,但是内部类还存在;为了让内部类可以继续访问这个变量,就让原来方法中局部变量复制一份作为内部类的成员变量;
- 但是将方法的局部变量复制为内部类的成员变量时,必须保证两个变量是一样的,这时候就需要使用
final
,对其进行初始化后不再去修改这个变量,这样就保证了内部类的成员变量和方法的局部变量的一致性。