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

【方向盘】-JDK 专栏收录该内容
116 篇文章 62 订阅

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


每篇一句

开豪车的人都想着换更好的车,开一般车的人总想着怎么省油,这是格局不一样

前言

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中的内存结构后,再频繁使用为佳


关注A哥

AuthorA哥(YourBatman)
个人站点www.yourbatman.cn
E-mailyourbatman@qq.com
微 信fsx641385712
活跃平台
公众号BAT的乌托邦(ID:BAT-utopia)
知识星球BAT的乌托邦
每日文章推荐每日文章推荐

BAT的乌托邦

  • 6
    点赞
  • 1
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值