哎,又是一个final引发的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哎,又是一个final引发的问题相关的知识,希望对你有一定的参考价值。

啥都不说了,今天我就是和final关键字给杠上了,看题:

public class Test {
    final int age;
    public Test(){
        age=10;
    }
    
    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

执行结果如下所示:

技术分享

 

思路分析:

 

今天忙活了一天有点累了,我也不扯那么多了,直接进入正题。我又做了个图,哈哈,不要打我,图这个东西可以声情并茂的解决问题,哦,不对,比喻错了,但是也可以解决问题!来看看执行顺序吧!这样就明白了。

技术分享

    前面不是说被final修饰过的不能发生改变吗?这句话一点也不错,确实没有发生改变,根据执行顺序我们可以看到,age属性的初始值就是10,因此执行结果是10很正常的。当代码改为如下时就能到达你心目中不能改变的要求啦!

    

public class Test {
    final int age;
    public Test(){
        age=10;
    }
    
    public void say(){
        age = 20; //执行错误,不能再次赋值
    }
    
    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

   当我们添加say()方法为age属性重新赋值时,程序就会出错。因此不能发生改变的情况是发生在初始化之后的。

public class Test {
    final int age = 8;
    public Test(){
        age=10;
    }

    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

  但是如上述情况中,age是直接就被初始化赋值了,因此在构造器中便不能再次赋值了。

    

以上是关于哎,又是一个final引发的问题的主要内容,如果未能解决你的问题,请参考以下文章

Finally-操作返回值

finally 块中的异常

片段对话框中的片段膨胀引发错误“片段未创建视图”

在 Finalizer 中处理 MemoryCache 会引发 AccessViolationException

异常和TCP通讯

final引发的结果