使用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修饰最后生成的字节码是一样的,功能效果也是一样的,只是程序员的个人编程习惯而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章