面试题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,对其进行初始化后不再去修改这个变量,这样就保证了内部类的成员变量和方法的局部变量的一致性。
posted @ 2021-10-24 09:26  DingJie1024  阅读(37)  评论(0编辑  收藏  举报