代码之家  ›  专栏  ›  技术社区  ›  Aly

方法参数中的final关键字[重复]

  •  125
  • Aly  · 技术社区  · 16 年前

    我经常遇到如下方法:

    public void foo(final String a, final int[] b, final Object1 c){
    }
    

    如果调用此方法而不传递最终参数,会发生什么情况。i、 e.稍后更改的Object1(因此未声明为final)可以很好地传递给该方法

    10 回复  |  直到 16 年前
        1
  •  208
  •   Thirler    5 年前

    Java总是在将参数发送到方法之前复制参数。这意味着final并不意味着调用代码有任何不同。这只意味着在方法内部不能重新分配变量。

    请注意,如果有最终对象,仍然可以更改对象的属性。这是因为Java中的对象实际上是指向对象的指针。并且只有指针被复制(并且在方法中是最终的),而不是实际的对象。

        2
  •  90
  •   BalusC    9 年前

    在某种情况下,你会 必修的 声明它为final,否则将导致编译错误,即将它们传递到匿名类中。基本示例:

    public FileFilter createFileExtensionFilter(final String extension) {
        FileFilter fileFilter = new FileFilter() {
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(extension);
            }
        };
    
        // What would happen when it's allowed to change extension here?
        // extension = "foo";
    
        return fileFilter;
    }
    

    final 修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建之后表现不同。

        3
  •  61
  •   Bozho    16 年前

    Java只是按值传递(或更好-按值传递引用)

    因此,传递的参数和方法中的参数是

    所以如果你改变 国家

        4
  •  43
  •   Erick G. Hagstrom    13 年前

    这个 final

    一些程序员(像我一样)认为这是一件非常好的事情,而且很有用 几乎每一个参数。它使理解一个长的或复杂的方法变得更容易(尽管有人可能认为长的和复杂的方法应该被重构) 以 最终的

        5
  •  22
  •   Rahel Lüthy    16 年前

    考虑FoE()的实现:

    public void foo(final String a) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                System.out.print(a);
            }
        }); 
    }
    

    因为 Runnable final 关键词-- 最终的 告诉编译器获取引用的副本是安全的(稍后再引用)。因此,它是 参考 . 换句话说:作为一个打电话的人,你不能把任何事情搞砸。。。

        6
  •  2
  •   SilentKnight    11 年前

    最终的

    因为这些方法中的参数意味着 它不允许程序员在方法执行期间更改其值 . 这只意味着在方法内部 最终的 无法重新分配变量。

        7
  •  1
  •   ttati    10 年前

    不需要方法输入参数中的final关键字。Java创建了对象引用的一个副本,因此在其上加final并不会使对象成为final,而只是使引用成为final,这是没有意义的

        8
  •  1
  •   Draken R. Shilling    8 年前


    class Bike11 {  
        int cube(final int n) {  
            n=n+2;//can't be changed as n is final  
            n*n*n;  
         }  
        public static void main(String args[]) {  
            Bike11 b=new Bike11();  
            b.cube(5);  
        }  
    }   
    

    输出:编译时错误

    有关更多详细信息,请访问我的博客: http://javabyroopam.blogspot.com

        9
  •  0
  •   Kilian Foth    16 年前

    但是,这并不是您可以将任何变量绑定到 final 参数编译器的所有检查都是没有重新分配参数 方法。这对于文档来说是很好的,可以说是很好的风格,甚至可以帮助优化字节码以提高速度(尽管这在实践中似乎做得不多)。

    但是,即使您在方法中重新分配了一个参数,调用方也不会注意到这一点,因为java将所有参数都按值传递。在序列之后

      a = someObject();
      process(a);
    

    a的字段可能已更改,但a仍然是以前的对象。在传递引用语言中,这可能不是真的。