专栏首页BAT的乌托邦【小家java】java中为final变量赋值的几种方式

【小家java】java中为final变量赋值的几种方式

前言

final修饰的变量,很多人第一印象就是不可变三个字。然后以为它只能在申明的时候就必须得赋值,其实不然,本文就重点讲述平时我们用到的final变量的赋值问题。

对被final修饰的变量进行赋值的几种方法

  1. 被final修饰的变量,有三种赋值方式。
  2. 被final static 修饰的变量,有两种赋值方式

在讲解之前,希望读者对静态代码块、构造代码块、构造方法的执行顺序了解清楚。【小家java】类中静态代码块、构造代码块、静态变量执行顺序和继承逻辑 和对final修饰的变量的内存特点有所了解。【小家java】final修饰的变量真的不可变吗?

精华部分:

当类被加载进内存的时候,这个属性并没有给其分配内存空间,而只是定义了一个变量,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件。

先看第一种情况的变量

被final修饰的变量:三种赋值方式
  1. 在定义时直接赋值。
  2. 声明时不赋值,在constructor中赋值(最常用的方式)
  3. 声明时不赋值,在构造代码块中赋值

如果一个非final成员变量在定义的时候没有赋值,那么它只可能在构造函数里被赋值了(不考虑构造代码块的情况) 这个特性在JDK以及Spring中都有大量的应用

private final int finalVal = 10;
 private final int finalVal;
    Demo (int val){
        this.finalVal = val;
    }
 private final int finalVal;
    {
        this.finalVal = 10;
    }

备注:在看Spring源码的时候,我们会经常看到它定义的final变量,然后对外提供构造函数给与赋值的设计模式。

我们得出结论:当你发现一个类的变量被final修饰但没被赋值,那么可以判断出它肯定会在构造函数里被赋值。(因为倘若是set方法赋值,现在是不安全的,因为set方法可以被调用多次,而final变量只能被赋值一次)

被final static修饰的变量:两种赋值方式
  1. 在定义时直接赋值.
  2. 在静态代码块里赋值

最后

final变量会经过JVM进行优化处理,所以平时使用过程中建议使用final变量。但更建议读者先重点了解下final变量在JVM中的内存结构后,再频繁使用为佳

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【小家java】匿名内部类为什么只能使用外部final的变量

    各位都知道,匿名内部类在使用的时候需要使用外部的变量,该变量必须被final修饰,否则编译报错。实际使用中,有时候确实还给我们造成了不少麻烦,可大家可曾想过这是...

    YourBatman
  • [享学Netflix] 二十二、Hystrix事件源与事件流:HystrixEvent和HystrixEventStream

    代码下载地址:https://github.com/f641385712/netflix-learning

    YourBatman
  • [享学Netflix] 三、Apache Commons Configuration2.x全新的事件-监听机制

    前面文章重点介绍了Apache Commons Configuration1.x的使用以及原理,作为2013就已经停更的技术,本确实没有太大必要再去学它,但就因...

    YourBatman
  • 【面试宝典】final 关键字

    面试官:你刚毕业? 小白:还没有,大四学校没有课,就想着出来找实习单位多学习学习。 面试官:很好嘛年轻人,早点出来锻炼确实是快速提高自己的一个好方法,那咱们就简...

    程序员互动联盟
  • Java关键字final、static使用总结

    用户1112962
  • 分布式做系统 Elastic-Job-Lite 源码分析 —— 作业初始化

    作业注册表( JobRegistry ),维护了单个 Elastic-Job-Lite 进程内作业相关信息,可以理解成其专属的 Spring IOC 容器。因此...

    芋道源码
  • Java中的String类能否被继承?为什么?

    不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。 Java对String类的定义: public final class ...

    nnngu
  • 【Java学习笔记之二十】final关键字在Java继承中的用法小结

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我...

    Angel_Kitty
  • 通过SSH隧道传递票证

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂
  • 当Linux用尽内存

    也许你很少面临这一情况,但是一旦如此,你一定知道出什么错了:可用内存不足或者说内存用尽(OOM)。结果非常典型:你不能再分配内存,内核会杀掉一个任务(一般是正在...

    一见

扫码关注云+社区

领取腾讯云代金券