浅谈final修饰的变量

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

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

原文地址:https://www.cnblogs.com/zhenghengbin/p/9678123.html

时间: 2024-10-14 17:51:26

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

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

int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final StringBuffer a=new StirngBuffer(); a=new StringBuffer();会报错: a.append("两");没错 这就说明final 修饰的变量是引用不能变,对象的内容可以变的:

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

我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变,还是引用的对象不能变 * StringBuilder 线程不安全 但速度快 * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变 * @author Tomato * */ public class TestFinal { public static void mai

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

两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能只想另外一个对象. 基本数据类型: package cn.yqg.day2; public class StringTest { public static void main(String[] args) { final int a; int b=234; a=b; System.out.println(a); } } 我们看到上面的代码a是final类型的,但是没有被初始化,所以

浅谈linux中shell变量$#,[email&#160;protected],$0,$1,$2,$?的含义解释

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,[email protected],$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$

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

见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(Outer.Inner.n); // 输出结果 : 10 //情况二 //Outer outer = Outer.Inner.outer; // 输出结果 : 静态内部类 //情况三 System.out.println(Outer.Inner.str); // 输出结果: 静态内部类 abc //情

表达式转型注意事项,和final修饰的变量会被JVM优化

1java中表达式转型需要注意 实例如下: byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6); 问会出现什么状况:A.输出结果:13,B.b6=b4+b5 编译出错   C.b3=b1+b2编译出错   D.运行异常 首先表达式转型注意以下规则: ①所有的byte,short,char型的值将被提升为int型: ②如果有一个操作数是long型,计算结果是long型

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

对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final StringBuilder sb = new StringBuilder("haha"); //同一对象的hashCode值相同 System.out.println("sb中的内容是:" + sb); System.out.println(sb + "的哈希编码

浅谈export 以及环境变量

简要说一下env,set,export的区别:env命令显示环境变量,set和export显示环境变量和自定变量. export:可以讲自定变量转化为环境变量之前有一个疑惑,我们定义环境变量PATH时习惯性的前面加一个export ,但是后来我测试不加export直接定义环境变量也会在export里面存在,经过查看资料研究才发现,系统的环境变量具有继承性,设置环境变量时不加export也会继承下去,但是自定变量就不一样了.必须前面加上export(或者declare -x  变量名)才具有继承性

浅谈PHP的静态变量

静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中.一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会.就是说,下次再调用这个函数的时候,该变量的值会保留下来. 只要在变量前加上关键字static,该变量就成为静态变量了.伯爵娱乐城 view source print? 01 <?php 02     function test() 03     { 04         static $nm = 1; 05         $nm = $nm * 2; 06