当前位置: 首页 > 面试题库 >

为什么在这种情况下会生成classname $ 1.class?

简俊楚
2023-03-14
问题内容

我编写了以下代码来实现Singleton模式:

public final class Test {
     static final class TestHolder {
         private static final Test INSTANCE = new Test();
     }

     private Test() {}

     public static Test getInstance() {
         return TestHolder.INSTANCE;
     }
}

当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $
1.class。这没有道理。那么,为什么以及如何呢?


问题答案:

TestHolder需要在中调用私有构造函数Test。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它
添加了一个Test仅知道的新的非私有构造函数!_该构造函数采用此匿名类的(未使用的)实例Test$1-没人知道它的存在。然后TestHolder创建的实例Test$1并调用
_该
构造函数,该构造函数是可访问的(默认保护)。

您可以使用javap -c Test(和javap -c Test\$1,和javap -c Test\$TestHolder)查看代码。实际上,它非常聪明!



 类似资料:
  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • 问题内容: 我正在使用节点4.1.1。当我运行这段代码 我得到这个错误 如果我将代码重新排列为 我得到了预期的结果。 为什么第二个起作用,而第一个失败?可以肯定的是,如果关键字是保留关键字,那么它在所有上下文中都是保留的,而不仅仅是在箭头函数中使用时? 问题答案: 这是因为箭头功能不是生成器功能。例如, 我们可以期望它起作用吗?否。因为不是生成器函数。同样适用于箭头功能。 FWIW,根据ECMAS

  • 安装问题 PS C:\Users\Administrator sharp@0.21.3安装C:\用户\管理员\gatsby-site3\node_modules\锐(节点安装/libvips 使用缓存的C:\Users\Administrator\AppData\Roaming\npm-cache\u libvips\libvips-8.7.0-win32-x64.tar.gz info shar

  • reactive 收集依赖不是要通过 Proxy 触发 get 吗,为什么这里只是打印 obj(没有触发 get),也能够收集到依赖?

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display: