美文网首页
java final关键字的一些理解

java final关键字的一些理解

作者: Bfmall | 来源:发表于2021-04-18 16:06 被阅读0次

    总结:
    final可以修饰变量(成员变量+局部变量)、方法和类;
    final变量不能再次赋值;
    final成员变量必须在声明时赋值或者在构造器中初始化,否则编译通不过;
    final局部变量必须在声明时赋值;
    匿名类中使用的局部变量必须是final声明;
    final方法不能被重写;
    final类不能被继承;

    一、修饰变量

    final修饰的变量必须初始化,且一旦初始化后不能再被修改,下面是初始化时机的具体分析:

    1、修饰成员变量

    不管是类变量(有static)还是实例变量(无static),可以在声明的时候就初始化。对于类变量来说,可以在类中声明final类变量,在类代码块中初始化,如下图所示。这是因为在类中声明定义类变量,编译器会将该代码移入类代码块中的相应位置;对于实例变量也类似,不过将类代码块换成构造器而已,由此可见jvm不会对final修饰的变量赋初值。

    //对于类变量来说,可以在类中声明final类变量,在类代码块中初始化
    
       public static final int a;
    
       static {
           a = 1;
       }
    
    
       public final int b;
       {
           b = 1;
       }
    

    那对于类变量来说,可不可以在类中声明为final,在构造器中在对其进行初始化呢?看下图可知是不行的。因为类变量和实例变量的分配空间的时机不同。类变量实在类初始化时就已经分配空间了,而实例变量在新建对象时调用构造器对其进行分配空间,并进行初始化。因此,在构造器被调用之前类变量就已经有了内存空间了,编译器发现此时final修饰的类变量没有初始化就会报错。按道理说,成员变量在没有显示初始化的情况下,系统会自动赋初值0或null,由此也可以推断出jvm并没有为final修饰的成员变量隐式初始化。


    image.png

    2、修饰局部变量

    java中局部变量必须显示初始化,jvm不会给局部变量隐式初始化,原因可能是一个方法中可能会声明多次,且声明周期可能各不相同,如果每次都默认初始化的话开销会很大,而且带来的效益并没有明显提升。final修饰局部变量时,只要在使用该变量前对其初始化即可,如下图所示:

    image.png

    3、修饰引用变量

    指的是不能改变引用的指向,即只能指向同一处地址,但是能够修改指向对象的内容。

    二、修饰成员方法

    final修饰的成员方法不能被子类重写,但可以重载和调用。

    三、修饰类

    final修饰的类方法不能被继承,但可以创建对象。

    四、修饰范围

    final不能用来修饰构造器,因为final修饰的成员方法不能被重写,而构造器既不能被继承,也不能被重写,用final修饰符多此一举

    相关文章

      网友评论

          本文标题:java final关键字的一些理解

          本文链接:https://www.haomeiwen.com/subject/aixplltx.html