Final 字段和匿名类

2024-04-01

我仍然对有关匿名类和最终字段的解释不满意。有大量问题试图解释明显的问题,但我还没有找到所有问题的答案:-)

假设以下代码:

public void method(final int i, int j) {
    final int z = 6;
    final int x = j;
    int k = 5;
    new Runnable() {
        public void run() {
            System.out.print(i);
            System.out.print(x);
            System.out.print(z);
            System.out.print(k);
        }
    };
}
  1. 由于“unfinal”,无法编译此代码k财产。
  2. 我知道编译器可以替换z编译时具有声明值的属性。

当我寻找解决方案时,到底如何工作i and x我找到了这个answer https://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen其中说:

然后,编译器可以将匿名类中的lastPrice和price替换为常量的值(当然是在编译时),这样您就不会再遇到访问不存在的变量的问题了

它如何适用于领域i and x如果它们是方法的参数?它们在编译时是未知的?这种方法可以适用于z.

另一方面,有一个关于堆栈问题 http://en.wikipedia.org/wiki/Final_%28Java%29#Final_and_inner_classes:

这允许 Java 编译器在运行时“捕获”变量的值并将副本存储为内部类中的字段。一旦外部方法终止并且其堆栈帧已被删除,原始变量就会消失,但内部类的私有副本仍保留在类自己的内存中

我会理解匿名类在创建过程中以某种方式复制了所有必需的内容(字段)。丢失的final有一个明显的问题,如果某些代码below匿名类声明会改变值,执行时使用可能stale价值观。

但是好的,这应该可以解决当匿名类的方法在所用属性的范围之外执行时的问题。

但这种方法应该有效even没有final声明,因为它只是复制所有字段。

这两种方法对我来说似乎都是独立的。说到这里 - 它可以解决我的问题 - 我还没有找到如何工作final方法字段。即使方法完成,它们也不会从堆栈中删除?对我来说似乎是无稽之谈,但它可以解释很多事情:-)

正确答案是什么?


由于需要将变量从方法复制到匿名类(如上所述),因此这是一个语言设计决策要求复制的变量是最终的。因此,无论是方法还是匿名类中的赋值都不会给出过时的值,并且代码会更加一致。

但!在 Java 8 中,这一要求得到了缓解:final如果变量是,则不再需要de factoFinal:在匿名类中“复制”变量后不允许进行赋值。

由于有许多函数符号,这是有道理的。否则是一个按钮actionPerformed当将其传播到另一个函数调用时,突然需要其参数为最终参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Final 字段和匿名类 的相关文章

  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • 使用 Java 编程式 HTML 文档生成

    有谁知道如何在 Java 中以编程方式生成 HTMLDocument 对象 而不需要在外部生成字符串 然后使用 HTMLEditorKit read 来解析它 我问的两个原因 首先 我的 HTML 生成例程需要非常快 并且我认为将字符串解析
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 存储过程将多个表返回到 spring jdbc 模板

    我正在使用 JdbcTemplate 从 Spring DAO 类调用存储过程 我的问题是 存储过程返回多个表 有没有办法使用 Spring JdbcTemplate 访问多个表 如果我使用jdbcTemplate queryForList
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • JDK 7 的快速调试/调试构建

    我正在寻找 JDK 的调试 或者我猜他们称之为快速调试构建 以启用在运行时生成的打印程序集以及查找性能问题时所需的其他诊断 就目前情况而言 我似乎找不到可以直接使用的 现成的 快速调试构建二进制包 有人可以帮我提供下载链接 或者至少提供有关
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而

随机推荐

  • 获取用户在当前之前浏览过的页面

    代替 login php ref http mysite com lastpage 我可以通过其他方式获得之前的页面吗 尝试了 HTTP REFERER 但无法让它工作 Notice Undefined index HTTP REFERER
  • 渲染 svg 文件并使用 Express 提供服务

    我想知道如何使用 Express 渲染和提供 svg 文件 现在 我可以将 svg 作为原始 XML 文件提供 这是我正在做的事情 route router get status function req res next res setH
  • Rails 中的共享 JS(咖啡)

    如果我想在不同文件之间共享一些 JavaScript 函数应用程序 资产 javascript组织目录结构的最佳方法是什么 假设我有共享 js 咖啡 sharedFunction gt Hello 现在 我如何在其他地方使用它 就像这里一样
  • Solr 复制和 Solr 云有什么区别?

    我支持 Rails 项目 其中包含 Rails 应用程序和 Solr 的附加实例 我的环境 rails 3 2 1 ruby 2 1 2 sunspot 2 1 0 Solr 4 1 6 Problem 云提供商不稳定 我不能使用其他云提供
  • Pandas groupby - 计算相对点的距离

    假设我有一些看起来像这样的东西 df pd DataFrame Event A A A A A B B B B B Number 1 2 3 4 5 6 7 8 9 10 Ref False False False False True F
  • Nexus One - Android 2.1 版本,2.1 的 SDK 在哪里?

    搭载 2 1 操作系统的 Nexus Android 手机今天上市 我的朋友 刚刚订购了两个 隔夜运送 我想这意味着明天或后天就会在他手中 人们在他们的生活中拥有 2 1 版本 这怎么可能接受呢 在开发人员接触 SDK 之前就动手 我已经有
  • Selenium:查找基本 URL

    我在不同的机器上使用 Selenium 来自动测试 MVC Web 应用程序 我的问题是我无法获取每台机器的基本网址 我可以使用以下代码获取当前网址 IWebDriver driver new FirefoxDriver string cu
  • 80 端口上的 heroku + nginx

    我正在尝试在 heroku 免费环境中启动 nginx 服务器 我准备了任何操作方法和教程 但我无法运行它 首先 我想在端口 80 上启动 nginx 作为默认 Web 服务器 然后我想将 nginx 配置为 underline expre
  • 3个表之间的内连接

    我在数据库中有这些表 country id country 1 USA 2 Brazil 和段表 id country 1 USA 2 Brazil 我有第三张表 Id segment id country id 其中segment id是
  • GSON 转换为 LinkedHashMap 而不是我的对象

    我有这段代码 public abstract class Repository
  • SQL:查找表中缺失的层次结构文件夹(路径)

    我有一个包含文件夹路径的表 我需要找到层次结构中这些文件夹之间的所有 间隙 我的意思是 如果表包含这 3 个文件夹 A A B C A B C D E F G 我需要在层次结构中找到以下丢失的文件夹 A B A B C D A B C D
  • Sonar 5.1 问题列表 - 如何按问题类型分组

    我们如何识别当前代码库中项目中最常见的问题类型 我们最近从 Sonar 4 5 升级到 5 1 在4 5中 我们曾经查看特定项目中的问题列表 并且问题按问题类型分组 例如 在一个项目中 规则 使用记录器记录此异常 可能是最常见的关键规则 有
  • 如何检查mysql中的二进制字符串是否为UTF-8?

    我找到了一个 Perl 正则表达式 可以检查字符串是否为 UTF 8 正则表达式来自w3c site http www w3 org International questions qa forms utf 8 en php field m
  • matplotlib 中的等高线图显示不正确的线型

    我正在使用轮廓图在 matplotlib 中绘制一个具有正值和负值的二维矩阵 它应该显示正值的实线和负值的虚线 loc matplotlib ticker MaxNLocator 20 Z psi lvls loc tick values
  • 在SSIS中使用执行进程任务和WinSCP进行SFTP传输

    我有一个User file txt文件放置在 WinSCP 根文件夹 USERDATA 中 我正在尝试将其下载到给定位置C User Local Executable C Program Files x86 WinSCP WinSCP ex
  • React 组件安装两次

    在我的 React Redux ReactRouterV4 应用程序的一小部分中 我有以下组件层次结构 Exhibit Parent ExhibitOne ExhibitTwo ExhibitThree 在 Exhibit 的子级中 还可以
  • 使用远程执行配置程序时,当 instance_count 大于 2 时,Terraform 会卡住

    我正在尝试使用 null resource 通过 Terraform 的远程执行配置程序来配置多个 Windows EC2 实例 terraform v Terraform v0 12 6 provider aws v2 23 0 prov
  • 如何使用 WriteEndElement 检查元素的名称

    我正在写 xmlXmlWriter http msdn microsoft com en gb library system xml xmlwriter aspx 我的代码有很多这样的部分 xml WriteStartElement pay
  • Kafka Consumer Group Id 和消费者重新平衡问题

    我正在使用卡夫卡0 10 0和动物园管理员3 4 6在我的生产服务器中 我有 20 个主题 每个主题大约有 50 个分区 我总共有 100 个消费者 每个消费者订阅了不同的主题和分区 所有消费者都具有相同的 groupId 那么 如果针对特
  • Final 字段和匿名类

    我仍然对有关匿名类和最终字段的解释不满意 有大量问题试图解释明显的问题 但我还没有找到所有问题的答案 假设以下代码 public void method final int i int j final int z 6 final int x