`
ssxxjjii
  • 浏览: 950791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA方法中的参数用final来修饰的原因

阅读更多
很多人都说在 JAVA 中用 final 来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的地方的变量的实际值不会被修改,另一种理解就是仅在调用方法内部不能被修改。
实际上第一种理解是错误的,对于基本类型来说,用不用 final 来修饰都是一样的效果,如下面的代码:
publicstaticvoid main(String hh[])
      {
            int i = 1;
            System.out.println(i);
            checkInt(i);
            System.out.println(i);
      }
      publicstaticvoid checkInt(finalint i)
      {
            i += 200;
      }
你把checkInt()方法中的参数设成final和非final的效果是一样子的。
对于引用类型来说也是一样子的,用不用修饰都不会改变引用地址,而都可以改变引用变量的属性值。如下:
 publicstaticvoid main(String hh[])
      {
            LoginInfo login = new LoginInfo();
            login.setPassword("1235");
            login.setUserName("mygod");
            System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());
            checkLoginInfo(login);
            System.out.println("username:"+login.getUserName()+",password:"+login.getPassword());
      }
     
      publicstaticvoid checkLoginInfo(final LoginInfo login)
      {
            login.setUserName("yun");
      }
 对于第二种说法,是这个样子的,我给了这个参数,你只能用这个参数的值,你不能修改它,对于基本类型和引用类型是一样的,如下:
  //如果不是final 的话,我可以在checkInt方法内部把i的值改变(有意或无意的,
      //虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的BUG
      publicstaticvoid checkInt(int i)
      {
            i = 200;//这样是可以的,不会编译出错的
            //do something
      }
 
      //如果是final 的话,我可以在checkInt方法内部就没办法把i的值改变
      //可以完全避免上面的问题
      publicstaticvoid checkInt(finalint i)
      {
            i = 200;//这样是不可以的,会编译出错的
            //do something
      }
 
      //final 的引用类型方法参数
      publicstaticvoid checkLoginInfo(final LoginInfo login)
      {
            login = new LoginInfo();//error,编译不过去
            //do something
      }
      //非final的引用类型方法参数
      publicstaticvoid checkLoginInfo(LoginInfo login)
      {
            //没有任何问题,但是肯定不符合此参数存在的初衷
            login = new LoginInfo();
            //do something
      }
 
匿名内部类的方法中使用final 就是这个道理
这是匿名内部类的规定,防止你在类里修改参数。
分享到:
评论
2 楼 wo371980755 2013-07-25  
xnzhao196 写道
public static  void checkInt(finalint i) 
      { 
            i += 200; 
      } 

这段代码是错的吧 ,你列举的第一个例子  ??求解答

是的。是错的
1 楼 xnzhao196 2011-08-08  
public static  void checkInt(finalint i) 
      { 
            i += 200; 
      } 

这段代码是错的吧 ,你列举的第一个例子  ??求解答

相关推荐

    final修饰类

    在Java编程语言中,`final`关键字有着重要的作用,它能用于修饰类、方法和变量,以限制它们的使用方式。下面将详细解释`final`修饰类、方法和变量的具体含义及其应用场景。 **final 修饰类** `final`修饰类的作用...

    java中final和static的区别

    4. 用 private 修饰的 static 成员变量和成员方法,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很...

    Java中的final关键字

    - 类级(静态)常量通常也用`final`修饰,例如`public static final`,这样的变量被称为常量,如数学中的圆周率π。一旦赋值,就不能更改,常用于定义程序中的固定值。 - `final`修饰的实例变量(非静态)意味着它...

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    ### Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释 #### 背景介绍 在Java编程语言中,局部内部类(Local Inner Class)是一种特殊的内部类形式,它被定义在某个方法或构造器的内部。...

    java面向对象之final修饰符.docx

    final修饰的形参在方法调用时根据传入的参数自动初始化,不能在方法内部再赋值。 ```java public class FinalLocalVariable { public void test(final int a) { // final形参不能在方法内赋值 // a = 5; // 非法 ...

    Java关键字final、static使用总结

    在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...

    java中final修饰符的使用方法

    在Java编程语言中,`final`关键字是一种非常重要的修饰符,它可以用来限制变量、方法和类的可变性。理解并正确使用`final`对于编写安全、稳定的代码至关重要。下面我们将详细探讨`final`修饰符的用法及其背后的原理...

    Java final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...

    java中final和static的总结

    3. **方法参数**:如果方法参数标记为`final`,则在方法体内部无法改变该参数的值。这有助于防止意外修改。 4. **匿名内部类**:`final`可以应用于局部变量,以便在匿名内部类中使用。这是因为内部类会捕获封闭作用...

    Java中static、this、super、final用法

    在Java编程语言中,`static`, `this`, `super`, 和 `final` 是四个非常重要的关键字,它们分别代表不同的概念并具有特殊的用法。 一、`static` `static` 关键字用于声明类级别的成员(变量或方法),这意味着它们...

    Java为什么匿名内部类参数引用需要用final进行修饰?

    Java匿名内部类参数引用需要用final进行修饰的原因分析 Java中的匿名内部类参数引用需要用final进行修饰,这是因为内部类中使用的外部变量需要延长其生命周期,以便在回调时能够找到该变量。下面是详细的分析: ...

    Java并发--final关键字.docx

    **二、final修饰方法** 1. **方法重写**:当父类的一个方法被`final`修饰,子类不能重写这个方法。例如,`Object`类中的`getClass()`方法就是`final`的,无法重写。而像`hashCode()`方法未被`final`修饰,可以被...

    浅谈Java中方法的参数传值.zip

    在Java中,可以使用final关键字修饰方法参数,确保该参数在方法内部不可修改。这对于防止意外修改参数值和提高代码可读性非常有用: ```java public void useFinalParam(final int num) { num = 10; // 编译错误,...

    Java final 修饰符知识点总结(必看篇)

    例如,Java中的`String`类就是`final`的,因此我们不能创建一个新的`String`子类来扩展其功能。 2. **final修饰方法** `final`修饰的方法表明该方法不能被子类重写,但可以重载。这意味着,尽管子类可以有相同名称...

    Java常见笔试、面试题目深度剖析 final详解

    在Java编程语言中,`final`关键字是一个非常重要的概念,它在多个方面有着广泛的应用,包括变量、方法和类的修饰。本篇文章将深入剖析`final`关键字在Java中的使用和意义,帮助读者理解其在面试和实际开发中的重要性...

    浅析Java中的final关键字Java开发Java经验技

    总的来说,`final`关键字在Java中起到了关键的约束和保护作用,保证了代码的稳定性和可预测性。理解并正确使用`final`,可以帮助开发者编写出更加安全、高效的Java程序。无论是定义常量、防止方法重写、阻止类继承...

    Java中final的用法.doc

    总结来说,`final`关键字在Java中扮演了多种角色,包括创建不可变变量、常量、对象和数组,确保方法和类的不可覆盖性,以及在多线程环境中的安全性。正确使用`final`能够提高代码的清晰度、稳定性和性能。

    Java 多线程与并发(6-26)-关键字- final详解.pdf

    * final修饰参数:final参数在方法中不能被修改。 二、final域重排序规则 final域重排序规则是指final域的访问顺序问题。在Java语言中,final域的访问顺序是:首先访问final域,然后访问非final域。 * final域为...

    Java中成员方法.pdf

    在 Java 中,成员方法可以被修饰符修饰,常见的修饰符有 public、private、protected、static、final 和 abstract。其中,final 修饰符用于声明最终方法,不能被子类覆盖;abstract 修饰符用于声明抽象方法,不能被...

Global site tag (gtag.js) - Google Analytics