`

JAVA 使用final参数的原因

    博客分类:
  • java
 
阅读更多

先介绍一些基本概念。

 

final是java里面的一个很重要的关键字。

 

 

final变量

  1. 如果变量时基本类型,那么这个变量一旦初始化之后就不能更改
  2. 如果变量时引用类型,那么这个变量的引用不能变,但是引用所指定的对象可以变

其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。

 

final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何 从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方 法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大 时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

final类
当 你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设 计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为 final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

 

 

下面说重点:为什么要把传入的参数用final修饰?

 

使用final参数主要是为了防止该参数在函数内部被修改,简单的说,就是我给了你这个参数,你不能修改它的值

 

  // 如果不是 final 的话,我可以在 checkInt 方法内部把 i 的值改变(有意或无意的,

      // 虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的 BUG
      public static void checkInt( int i)
      {
            i = 200;// 这样是可以的,不会编译出错的
            //do something
      }
 
      // 如果是 final 的话,我可以在 checkInt 方法内部就没办法把 i 的值改变
      // 可以完全避免上面的问题
      public static void checkInt( final int i)
      {
            i = 200;// 这样是不可以的,会编译出错的
            //do something
      }
 
      //final 的引用类型方法参数
      public static void checkLoginInfo( final LoginInfo login)
      {
            login = new LoginInfo();//error, 编译不过去
            //do something
      }
      // final 的引用类型方法参数
      public static void checkLoginInfo(LoginInfo login)
      {
            // 没有任何问题,但是肯定不符合此参数存在的初衷
            login = new LoginInfo();
             //do something
      }

 

 

 

 

 

分享到:
评论

相关推荐

    java中final与finally的使用介绍

    本篇文章介绍了,在java中final与finally的使用。需要的朋友参考下

    Java中final作用于变量、参数、方法及类该如何处理

    Java中的final关键字非常重要,它可以应用于类、方法以及变量,下面这篇文章主要给大家介绍了关于Java中final作用于变量、参数、方法及类该如何处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...

    Java中final关键字的用法总结

    在Java中,final可以别用来修饰类、修饰方法、修饰变量和修饰参数等,这里就来简单作一个Java中final关键字的用法总结:

    java多线程关键字final和static详解

    主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java编程中影响性能的一些点

    1.尽量使用final修饰符。  带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 什么是局部变量(Local Variable) 175 7.7.2 什么是实例变量(Instance ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 什么是局部变量(Local Variable) 175 7.7.2 什么是实例变量(Instance ...

    Java socket 的参数选项解读

    java socket中有很多参数可以选择,这篇博客的目的是沉淀出这些参数的语义和用法,供自己以后查阅。  1、java socket参数选项总览  在JDK1.6中有如下参数选项: 1 public final static int TCP_NODELAY = 0x...

    java 模拟 面试题 答案

    方法的参数被final修饰表示在方法体内,该参数的值不可以被修改。 finally在异常处理时提供finally块来执行任何清除操作。无论有没有异常被抛出、捕捉,finally块都会被执行。 finalize是方法名。Java技术允许使用...

    Java2实用教程.rar

    12 5JavaApplet中使用套接字 习题 第13章常见数据结构的Java实现 13 1链表 13 2栈 13 3树集 13 4树映射 13 5散列集 13 6散列表 13 7向量 习题 第14章图形与图像 14 1绘制文本 14 2绘制基本图形 14 3建立字体 14 4...

    类的使用,学习,小结 java定义一个学生类

    java定义一个学生类 class A{ private double a; A(){} ... [public /protected /private /static /final /abstract] 返回值类型 方法名字(参数){ //如果返回值类型不是void,必须有return语句 } }

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    Java经典面试题.pdf

    4.什么是Java的final关键字? final关键字用于修饰类、方法和变量。 修饰类:被final修饰的类无法被继承。 修饰方法:被final修饰的方法无法被子类重写。 修饰变量:被final修饰的变量为常量,不能被修改。 5....

    JAVA面试题最全集

    被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 ...

    java为什么匿名内部类的参数引用时final?final局部变量的生命周期

    在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很清楚,我把两篇文章简单的总结了一下: ...1.问题的引出 ...

    《java面向对象程序设计-继承和多态》教案.doc

    示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此类...

    史上最全Java面试题目大集合

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    Java关键字总结

    总结了Java学习中的52个关键字(包括一些总结),如果觉得自己Java基础知识需要总结一下的,可以下载下来瞧瞧 1.final数据: 1>对于基本类型前加以final修饰,表示被修饰的变量...4>final参数:对于基本类型的变量,这

    java试卷(含答案)

    子类可以定义与父类同名的方法,称为方法的覆盖,方法覆盖要求子类的方法与父类的方法名字和参数都相同,但返回值类型可以不同。 子类要调用父类的方法,必须使用super关键字。 4.最终类不能派生子类,最终方法不...

Global site tag (gtag.js) - Google Analytics