在方法参数上使用final关键字

经过一些自己的混淆,最终博客方法的具体含义(最终声明的方法参数)将对此博客条目进行澄清。

至少可以将方法参数上的final关键字视为Java编译器的指示符,表明该参数不能重新分配给另一个引用。 Java参数处理始终是“按值调用” (是的,即使在处理对象时也是如此),这是为什么。这是真的。当处理非原始数据类型时,Java处理对对象的引用。 对象本身不会从被调用者传递给目标函数! 而是传递一个指向所需对象的引用。 但是,此引用不等同于被调用方,因为它只是一个副本。 传递给函数的是将复制的引用作为值-好的,每个人都还在吗? :-)也许Java应该使用更匹配的解释“按复制参考调用作为值”

总结一下:

Java仅以“按值调用”样式传递所有方法参数 (原始数据类型或对对象的引用)!

为了证明这一点,让我们看一下下面的演示代码及其输出。

/*** Call by Value Test Application.** @author Christopher Meyer* @version 0.1 * Apr 21, 2012*/
public class CBVTest {public static void main(String[] args) {Integer mainInternInteger = new Integer(1);/** Even references are copied during calls!** Explanation Objects are never passed, only references to them, BUT* references are copied! So only reference COPIES reach the method.* Neither changes to the reference inside/outside the method will* influence the counterpart.** Maybe it should be called "Call by Copied Reference as Value".*/class RunMe implements Runnable {Integer runnerInternInteger;public RunMe(Integer i) {runnerInternInteger = i;/** The following operation will have no effect on the main* thread, since the reference to "i" is a copied one.* Interfacing the "caller" reference is prevented.*/i = new Integer(3);}@Overridepublic void run() {while (true) {System.out.println(runnerInternInteger.intValue() + "\t (runner intern value)");}}}Thread runner = new Thread(new RunMe(mainInternInteger));runner.start();// Create a new object and assign it to "mainInternInteger".mainInternInteger = new Integer(2);while (true) {System.out.println(mainInternInteger.intValue() + "\t (main intern value)");}}
}

代码的输出如下所示:

...
2     (main intern value)
2     (main intern value)
2     (main intern value)
2     (main intern value)
1     (runner intern value)
2     (main intern value)
1     (runner intern value)
2     (main intern value)
1     (runner intern value)
2     (main intern value)
1     (runner intern value)
1     (runner intern value)
1     (runner intern value)
1     (runner intern value)
1     (runner intern value)...

因此,对已处理参数的赋值(i = new Integer(3))或从调用类进行的重新赋值(mainInternInteger = new Integer(2))都不会相互影响。

那么,如果没有必要,那又有什么价值呢?

如果添加到RunMe的构造方法中(公共RunMe(final Integer i)),则重新分配i = new Integer(3)会引发异常:线程“ main”中的异常java.lang.RuntimeException:无法编译的源代码–最终参数我可能不会被分配。 它可以防止因意外重新分配而导致的故障。 意外分配给已处理的参数将始终失败! 最终迫使开发人员生成准确的代码。

final关键字不是方法签名的一部分。 因此,无论是否声明为final,编译后的代码都是相同的(每个人都可以使用diff轻松检查)。 这意味着,一旦声明了方法参数,就不会重载该方法的参数,而一旦声明则不会。 由于字节码保持相同,因此对性能也绝对没有影响。

更令人困惑的是,请记住,在可以修改变量时(例如,在处理线程的匿名内部类时,如果您不清楚在同一上下文中考虑多个变量,则内部类需要定义一个变量final)。可以更改的相同名称)。

参考:在Java安全和相关主题博客上 ,使用我们JCG合作伙伴 Christopher Meyer的方法参数上的final关键字 。


翻译自: https://www.javacodegeeks.com/2012/04/using-final-keyword-on-method.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP MySQLi 增删改查

最近几天,我们一直在学习利用MySQLi访问数据库并对其中的数据进行操作。今天给大家展现一个完整的例子,我们来制作一个新闻发布系统,利用MySQLi来操作数据库,实现对新闻的添加、修改、删除、查询等基本功能。(以下代码…

20162303《程序设计与数据结构》第一周学习总结

学号 2016-2017-2 《程序设计与数据结构》第1周学习总结 教材学习内容总结 本周学习了基本的JAVA知识,虽然比较基础,但是在实际过程中还是出现了许许多多的问题,代码一遍遍的敲错,又一遍遍的修改,刚开始甚至不会切换模…

Java EE与NoSQL的未来

自一段时间以来,我一直在关注NoSQL的近期发展势头,似乎这个流行语也引起了企业Java界的某种关注。 即EclipseLink 2.4开始支持MongoDB和Oracle NoSQL 。 将EclipseLink作为JPA参考实现,您可能想知道这对Java EE 7意味着什么。这里简短说明&am…

【C/C++开发】C语言实现函数可变参数

函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 在printf()函数中,format后面的参数个数不确定,且类型也不确定,这些参数都存放在栈内.调用…

java postgresql json_java – 将PostgreSQL JSON列映射到Hibernate值类...

See PgJDBC bug #265.PostgreSQL对数据类型转换过于严格,非常严格.它不会隐式地将文本转换为类似文本的值,例如xml和json.解决此问题的严格正确方法是编写使用JDBC setObject方法的自定义Hibernate映射类型.这可能有点麻烦,所以你可能只想通过创建一个较弱的强制转换来使Postgr…

面向接口编程详解(三)——模式研究

通过前面两篇,我想各位朋友对“面向接口编程”的思想有了一定认识,并通过第二篇的例子,获得了一定的直观印象。但是,第二篇中的例子旨在展示面向接口编程的实现方法,比较简单,不能体现出面向接口编程的优势…

错误学习:Java + OSGi

最近,我致力于在OSGi环境中使Apache Hive工作。 虽然没有被证明是小菜一碟(软件对吗?。。为什么我不感到惊讶? ),它引导我解决了各种Java和OSGi错误。 在这里,我列出了其中一些让我有些吃力的东…

iOS多Targets管理

序言: 个人不善于写东西,就直奔主题了。 其实今天会注意到多targets这个东西,是因为在学习一个第三方库FBMemoryProfiler的时候,用到了,所以就搜索了一些相关资料,就在这里记录一下。 可能每个人都会遇到这…

优化的34条定律

1.Minimize HTTP Requests 减少HTTP请求 图片、css、script、flash等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,…

休眠提示:排序和排序

让我们介绍另一个休眠性能提示。 你还记得以前的休眠的模式后 ? 我们有一个与一对多协会有关的星际飞船和军官。 Entity public class Starship {Id GeneratedValue(strategyGenerationType.SEQUENCE) private Long id;public Long getId() {return id;}protected v…

java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析

在java中,除了long和double的8个字节、64位比特的变量外,其他的基本变量都是原子性的。java存储模型要求获取和存储操作都为原子性,但是对于非volatile的long和double变量,jvm允许将64位的读或写划分为两个32位的操作。如果读和写…

MySQL配置文件mysql.ini参数详解

my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数。 my.ini分为两块:Client Section和Server Section。 Client Section用来配置MySQL客户端参数。 要查看配置参数可以用下面…

微信公众平台和微信开放平台的区别

自己也刚开始做微信开发,先写写自己的认识: 用微信公众平台可以做手机端H5页面的微信登录,微信支付 用微信开放平台可以做PC端网页的微信登录。 转载于:https://www.cnblogs.com/mafeng/p/5610770.html

java 传递bean_如何将bean作为参数传递给JSP标记?

我ve created a custom JSP tag that is supposed to accept a list of products to render, but I我无法弄清楚如何将列表传递给标签 . 产品列表作为页面范围的bean存在 . Web应用程序使用Struts taglib在Struts 1.2.x中编写 .这是我的代码的简化版本:renderProduc…

Business Component(BC)和Business Object(BO)

Siebel应用架构的一个成功的地方就是在应用里引入了BC,BO的概念,从而使得几千张关系数据表能够按照业务的含义组织成业务对象,对于业务人员而言具有了业务上的含义,而不仅仅是从技术人员的观点来对待数据(就是关系表而…

NetBeans可用性提示

的Java IDE都来了,因为在很长的路要走天的JBuilder的 (尽管JBuilder中似乎是一个值得欢迎提前在时间)。 当今的Java IDE(例如NetBeans , Eclipse , IntelliJ IDEA和JDeveloper )是非常先进的工具…

一个JVM进程启动后里面有几个线程

在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序。但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程的程序,至少得有一个垃圾收集器线程…

WPF 反编译后错误处理

1. 首先,手动创建一个WPF工程(WpfApplicationReflectorDemo) 2. 把生成的WpfApplicationReflectorDemo.exe 拖到ILSpy里 3.点击 File -> Save Code...: 相应的代码会生成到指定地方。 4. 打开应用程序,并且编译它,此…

JavaFX 2 GameTutorial第1部分

介绍 我相信大多数软件开发人员可能会在年轻人(年轻人)一生中的某一时刻被迫创建游戏来帮助他们学习编程语言(我知道我确实做到了)。 以前,我的第一台计算机实际上是Franklin Ace 1000 ,后来是Apple [] 。 …

虚拟现实-VR-UE4-认识UE4

VR的火热,让每个人都想参与一下, 公司在展会上面搞了一个VR的Demo,关注度超出预期,使得公司高层决定来个VR项目 所以 关于UE4 百度百科地址:http://baike.baidu.com/link?urlmEmbwOcqEuqtkfdu9lNdxVtWAkv0Q6UHZ4VgIHr…