一直大概的知道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修饰的常量,在编译阶段会存入调用类的常量池中

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

浅谈final修饰的变量的更多相关文章

  1. final修饰的变量是引用不能变还是对象的内容不能变?

    int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...

  2. final修饰的变量是引用不能改变还是引用的对象不能改变

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变, ...

  3. Java中Final修饰一个变量时,是引用不能变还是引用的对象不能变

    Java中,使用Final修饰一个变量,是引用不能变,还是引用对象不能变? 是引用对象的地址不能变,引用变量所指的对象的内容可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的 ...

  4. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  5. final修饰的变量引用不能变还是对象不可变

    两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能指向另外一个对象. 基本数据类型: package cn.yqg.day2; publ ...

  6. 并不是static final 修饰的变量都是编译期常量

    见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...

  7. 浅谈final关键字的用法

    1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...

  8. 浅谈Final

    Java关键字final有“这是无法改变的”或者“终态的”含义,final可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.fina ...

  9. final修饰的变量是引用不能改变,还是引用的对象不能改变???

    对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final St ...

随机推荐

  1. 分享一个excel根据文件超链接获取链接文档的最后更新时间

    #获取制定单元格内超链接对应的链接地址Sub geturi() For Each cell In Range("E3:E43") If cell.Hyperlinks.Count ...

  2. JAVA框架 Spring AOP--切入点表达式和通知类型

    一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...

  3. Android Frame动画demo

    Android动画介绍:Android为我们提供了两种动画实现,Frame和Tween. 两者之间的区别: 1.Frame动画:就像放电影一样,是通过预先做好的图片进行连续播放从而形成动画效果 2.T ...

  4. day05今日学习总结:字符串类型

    昨日学习复习: 数据类型: 有序.无序 有序:可以根据索引查找的数据 可变不可变 可变:在值变的情况下,id不变,证明原值是在改变的 不可变:在值变的情况下,id也跟着变,证明不是在改原值. 今日学习 ...

  5. BroadcastReceiver广播相关 - 转

    BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播. 一.注册广播 在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者.要写一个类来继承 ...

  6. Python3入门(十)——调试与测试

    一.异常处理 1.try...except...finally... 这个也就是Java里的try...cath..finally...了,直接看经典代码: try: print("开始执行 ...

  7. tkinter 弹出窗口 传值回到 主窗口

    有些时候,我们需要使用弹出窗口,对程序的运行参数进行设置.有两种选择 一.标准窗口 如果只对一个参数进行设置(或者说从弹出窗口取回一个值),那么可以使用simpledialog,导入方法: from ...

  8. Sterling B2B Integrator与SAP交互 - 02 安装配置

    系统组成: 1. 服务器OS及硬件: OS: Red Hat Enterprise Linux Server release 6.6 Hardware: Virtual Machine, x86_64 ...

  9. win10+anaconda3+python3.6+opencv3.1.0

    最近用windows系统比较多,就想在win10下搞一下深度学习这一方面的研究,那么就需要配置好环境巴拉巴拉的一堆东西.默默记个笔记,正所谓“好记性不如烂笔头”. 1.安装Anaconda 这个是一个 ...

  10. LintCode——交叉字符串

    描述:给出三个字符串:s1.s2.s3,判断s3是否由s1和s2交叉构成. 样例:s1 = "aabcc" s2 = "dbbca" - 当 s3 = &quo ...