使用final修饰局部变量???

在编程中我们偶尔会看到如下的代码:

    public void foo(final int arg){
        final int localData = 0;
        // ...
    }

以及与之相似的代码

    public void foo(int arg){
        int localData = 0;
        // ...
    }

这两段代码的主要区别就是:局部变量是否使用了final关键字修饰。有同学可能会想问使用关键字final修饰有什么作用呢?哈哈哈哈,其实没什么卵用,仅仅是不同程序员的编程风格而已。

原因:
这要从class文件的结构说起,class文件的数据结构在设计时,对于局部变量和字段(实例变量、类变量)是区别对待的。字段在class中有access_flags属性用来记录字段的修饰符,例如final、static、private等。而局部变量是没有这个属性信息的,简而言之,上面的两段代码在经过javac的编译后生成的class文件是一模一样的。final不可变性的保证是靠编译器来保证的。
使用final修饰局部变量和不用final修饰最后生成的字节码是一样的,功能效果也是一样的,只是程序员的个人编程习惯而已。

发布了477 篇原创文章 · 获赞 588 · 访问量 267万+

猜你喜欢

转载自blog.csdn.net/qq_15037231/article/details/101626408