关于final修饰的变量

参考文章 :https://blog.csdn.net/weixin_42061676/article/details/80226860

https://www.cnblogs.com/zhenghengbin/p/9678123.html

一、赋值的方式

 1、可以定义变量时直接赋值

2、可以在代码块中进行赋值(静态代码块和构造代码块)

3、可以再构造方法中进行赋值。

总结起来,就是要在对象创建之前完成赋值的过程。

二、值能不能改变的问题

1、对于基本数据类型的,如byte short char int 等,赋值后被final修饰的变量不能改变。

2、对于引用数据类型,地址不能改变,但是地址中的值可以发生改变。(String和包装类除外)
 

一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值。一开始我只是用private修饰的,心里想的是如果final修饰的话,应该不能修改了。毕竟被final修饰的变量不可变。今天回家后,做了下面的尝试,彻底暴露出自己基础的不扎实。

final的作用

  • 被final修饰的类不可以被继承

  • 被final修饰的方法不可以被重写

  • 被final修饰的变量不可变

实战演示

1、首先看下面代码

public class FinalDemo {
    private static final Map<String, Object> NAME = new HashMap<>(16);
    private static final List<String> LIST = new ArrayList<>(10);
    private static final String[] TYPE = new String[15];
    private static final StringBuilder SB = new StringBuilder("22");
    private static final StringBuffer SBU = new StringBuffer("22");
    private static final String S = "44";
    private static final int num = 44;
    private static final String S1 = new String();



    public void setName() {
        NAME.put("1", "maomao");
        LIST.add("11");
        TYPE[0] = "1";
        SB.append("12");
        SBU.append("32");
        System.out.println(NAME);
        System.out.println(LIST);
        System.out.println(Arrays.asList(TYPE));
        System.out.println(SB.toString());
        System.out.println(SBU.toString());
    }

    public static void main(String[] args) {
        FinalDemo finalDemo = new FinalDemo();
        finalDemo.setName();
    }


}

2、运行结果

{1=maomao}
[11]
[1, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
2212
2232

3、由此可见:

  • 用了map、list、数组、StringBuilder 、StringBuffer .它们的内容是可以修改的。
  • String和基本数据类型修饰的变量。同样final表示地址不能修改,但是地址的存储跟常量的值有关,给他重新赋值会指向另外一个对象,地址就改变了。

总结

被final修饰的变量,不可变的是变量的引用,而不是变量的内容

当然,final还有其他作用,比如:

  • 被final修饰的常量,在编译阶段会存入调用类的常量池中

这一块暂时不先探讨,现在自己水平还没到。还需要继续努力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值