`
iamxi
  • 浏览: 191791 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

对Final参数的的一些理解

    博客分类:
  • Java
阅读更多

      今天在看《程序员修炼之道》的时候看到了以”final“来修饰的方法参数,想起了之前在项目中也有人这么写,当然知道final修饰的属性无法被变动的,但是用在参数中,除了无法让其修改参数外,还有什么深意么?处于好奇就google了下。

      在《Thinking in Java》中有这么一句:Java允许在参数列表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象。

      不过是不能改变这个引用,或是不能改变引用所指向的对象,还是二者都不可修改呢?

      做个例子,如下:

        public int intTest(final int i){
		//i++;		错误
		//i += 1;	错误
		//i = 1;	错误
		return i;
	}
	
	public String stringBufferTest(final StringBuffer str){
		//str = new StringBuffer();	错误
		str.append("a");
		return str.toString();
	}

 注解中标有错误的都无法通过编译,使用IDE话直接提示错误。

      通过测试,第二个方法运行正常,所以得出结论,final修饰的参数,引用是绝对不允许修改的,而引用所指向的对象是可以修改的。(网上给出的例子很多,我只是无聊自己试了下)

 

      不过查资料过程中也看到了网友给出的一个疑问的例子

class Value   {
       int   val   =   0;
}


public class FinalArgument{
        public static void funValue(Value v){
                 v = new Value();
                 ++v.val;
        }

        public static void funValueFinal(final Value v){
                //!v = new   Value();
                funValue(v);
        }

        public static void main(String[] args){
                Value a =new Value();
                System.out.println( "a.val= " + a.val);
                funValueFinal(a);
                System.out.println( "a.val= " + a.val);
        }
} 

 代码的输入结果是:

a.val=0
a.val=0

 

      疑问在于,既然final参数不能修改为什么还能传给一个可变的参数,为什么在funValue方法内的改变没法改变外部的值。

      第一点,JAVA没有限定不可以把final修饰的常量传给非final的。

        public String stringTest(final StringBuffer str){
		//str = new StringBuffer();	错误
		str.append("a");
		StringBuffer newSB = str;
		return newSB.toString();
	}

 上面代码,完全合法。

       而关于第二个疑问,完全JAVA的一个基本知识的理解不够透彻的结果,或则说是对JAVA参数传递的理解不够深入。JAVA的实参实际是一个副本,即在作为参数传入时候把原来的变量拷贝一份进入栈中,也就是说,原有的变量和参数实际是两个不同的...不知道怎么说了,用C语言来说就是两个不同的指针,但是指针所指向的地址是同一个,这就是为什么对传入的参数的引用内容做修改会影响到方法外面的变量。但是当new一个新的时候,参数的指向的地址发生了变化,所以...

       可以参考下以下文章,就会有个深入的理解,文章来自“梦想风暴”的博客——《Java基本功——reference》

分享到:
评论
2 楼 duanmuxiao 2014-04-25  
final类型的参数传到非final参数的方法中后参数的final属性就消失了???
1 楼 SSB4455 2013-10-12  
funValue方法内的改变不能改变外部的值呀

相关推荐

    Final Effects汉化插件

    3. 应用效果:选择你需要的特效,将其拖拽到时间线中的目标视频或音频剪辑上,然后在效果控制面板调整参数以达到理想效果。 4. 预览和渲染:在预览窗口查看效果,满意后进行完整视频的渲染输出。 为了更好地使用...

    Java中的final关键字

    5. **final参数** - `final`修饰的形参表示该参数的值在方法体内不能改变,增强了代码的可读性和防止意外的副作用。 6. **final和多线程** - 在多线程环境下,`final`字段具有特殊的含义,它们可以被JVM保证初始...

    final glow插件

    5. **效率优化**:尽管增加了复杂的光照效果,Final Glow在渲染速度上做了优化,减少了对计算资源的需求。 总的来说,Final Glow插件是3DS Max用户提高作品质量、创造独特视觉体验的重要工具。通过学习和熟练掌握其...

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

    5. **final参数** - `final`关键字也可以用于方法参数,表示参数在方法体内不能被重新赋值。这有助于代码的可读性和避免意外的修改,特别是在长方法或多线程环境中。 6. **final与效率** - Java虚拟机(JVM)可能...

    Java final关键字

    在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量。当一个变量被声明为`final`时,它的值一旦被初始化后就不能再改变。这适用于局部变量、成员变量(包括...

    FinalIK-1.3

    而一系列的extra-images*图片文件可能是插件功能的示例或演示,通过这些图像,开发者可以直观地理解FinalIK-1.3的各种特性。 总的来说,FinalIK-1.3是Unity开发中不可或缺的工具之一,它将复杂的IK设置过程简化,让...

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

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

    final修饰类

    当函数的参数声明为`final`时,表明该参数是只读的,不允许在方法内部改变其值,这在多线程环境下可以避免意外的修改。 总结来说,`final`关键字提供了代码的稳定性和安全性,它可以帮助开发者定义不可变的对象,...

    FinalIK反向动力学

    在Unity中,Final IK通过简单易用的界面和组件,使得开发者无需深入理解复杂的数学算法就能实现IK功能。用户可以直接在Inspector窗口中调整IK参数,或者通过脚本接口进行更高级的自定义设置。此外,插件还支持与...

    Unity 插件 逆向动画Final IK.rar

    《Unity中的Final IK插件详解》 在游戏开发领域,Unity3D(简称U3D)作为一款强大的游戏引擎,广泛应用于各种类型的游戏制作。...通过深入理解和熟练运用Final IK,开发者可以创造出更生动、更具沉浸感的游戏体验。

    hibernate-release-5.3.2.Final

    使用Hibernate ORM通常需要配置Hibernate配置文件(hibernate.cfg.xml),定义数据库连接参数、缓存策略等。实体类需使用注解标注属性与数据库字段的对应关系,然后通过SessionFactory创建Session,进而进行数据操作...

    FINAL.EFFECTS插件

    汉化后的界面使得用户能快速理解各个功能,提高工作效率。 3. 应用实例:FF插件的粒子效果在电影、电视广告、游戏预告片以及各种视觉艺术项目中都有广泛应用。例如,制作逼真的爆炸、火焰特效,或者创建梦幻般的...

    java中final和static的总结

    在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...

    AE插件-FE(Final Effect)

    对于标签"AE FE Final Effect",我们可以理解这是指AE中的Final Effect插件,它涵盖了AE(Adobe After Effects)、FE(Final Effect)以及可能与这个插件相关的关键词。在实际工作中,熟悉这些标签可以帮助用户更快...

    stati、thi、supe、final关键字详解

    无论创建多少个对象,静态变量c都只有一个副本,其值对所有对象可见。当你通过一个对象调用inc()方法增加c的值时,所有对象都能看到这个变化。 二、this关键字 在Java中,this关键字用于引用当前对象的实例变量。当...

    hibernate3.6.10.Final

    8. **持久化对象状态**:Hibernate管理的对象有瞬时态、持久态和脱管态,理解这些状态有助于更好地控制对象的生命周期。 9. **级联操作**:在关联映射中,可以设置级联属性,使得对父对象的操作自动影响到子对象。 ...

    实验报告_Final1

    通过这个实验,学生能够掌握虚拟机的安装、Linux的基本使用、Pintos的安装、编译、跟踪和动态调试方法,以及操作系统核心组件的实现,这对深入理解操作系统原理和提升软件开发技能具有重要意义。

    Vecino-Final.rar_La final

    Vecino-Final.rar_La final 是一个压缩包文件,它包含了一个名为 "Vecino Final" 的项目或程序,可能是用于实现或演示最近邻算法(K-Nearest Neighbors,KNN)的应用。KNN 是一种在机器学习领域广泛应用的分类和回归...

    final用法........

    总之,`final` 关键字在 Java 中扮演着至关重要的角色,它提供了常量定义、防止覆写、防止继承以及确保数据不可变性等特性,使得代码更加安全和易于理解。正确使用 `final` 可以提高代码的健壮性和可维护性。

    KiritoService_9.1.3_Final.7z

    《KiritoService_9.1.3_Final:深入解析与应用》 在IT领域,我们经常需要处理各种软件和服务,而“KiritoService_9.1.3_Final.7...全面理解和有效利用这个服务,需要对相关技术有深入的了解,并遵循最佳实践进行操作。

Global site tag (gtag.js) - Google Analytics