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

为什么带有内部类的Java代码会生成第三个SomeClass $ 1.class文件?

訾安邦
2023-03-14
问题内容

如果我有一个内部类,像这样:

public class Test
{
    public class Inner
    {
        // code ...
    }

    public static void main(String[] args)
    {
        // code ...
    }
}

编译时,我希望它会生成两个文件:

Test.class
Test$Inner.class

那么,为什么即使SomeClass不包含名为“ 1”的内部类,有时我还是还是会看到类似SomeClass $ 1.class的类文件?


问题答案:

SomeClass $ 1.class代表匿名内部类

在这里查看匿名内部类部分



 类似资料:
  • 内部 [[Class]] typeof 的结果为 "object" 的值(比如数组)被额外地打上了一个内部的标签属性 [[Class]](请把它考虑为一个内部的分类方法,而非与传统的面向对象编码的类有关)。这个属性不能直接地被访问,但通常可以间接地通过在这个值上借用默认的 Object.prototype.toString(..) 方法调用来展示。举例来说: Object.prototype.to

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 我有两个顶级班;每个都有一个同名的内部类: 我的期望是最终得到四个类文件,包括一个$TestCase。类和B$TestCase。类,这是我从命令行编译时得到的。然而,Eclipse只是创建了测试用例。类,并声明当我尝试编译B.java时“类型TestCase已经定义”。 是否有一个Eclipse选项,我可以设置为生成(我认为是标准的)A$TestCase.class和B$TestCase.clas

  • 问题内容: 我注意到了Collections.sort的规格: 为什么这里需要“ ”?如果是extend ,那么我们是否不能保证a 仍然能够比较两个对象而没有“ ”部分? 换句话说,给出以下代码: 为什么即使不为Collections.sort()的声明指定“ ”,编译器也不足够聪明地知道这是可以的? 问题答案: Josh Bloch今年在Google I / O上做了一个名为“ 有效Java重新

  • 问题内容: 我观察到外部类可以访问内部类的私有实例变量。这怎么可能?这是演示相同代码的示例代码: 为什么允许这种行为? 问题答案: 内部类只是一种将真正属于原始外部类的功能完全分开的方法。当你有两个要求时,可以使用它们: 如果是在单独的类中实现的,那么外部类中的某些功能将最为清晰。 即使在单独的类中,该功能也与外部类的工作方式紧密相关。 鉴于这些要求,内部类可以完全访问其外部类。由于它们基本上是外

  • 问题内容: 如果仍然无法在包含类的外部访问它,则用Java声明一个私有内部类的成员的原因是什么?可以吗 问题答案: 如果该类没有扩展任何类或实现任何接口,那么我认为这是无稽之谈,因为没有其他类可以访问它的任何实例。 但是,如果它扩展或实现了任何其他非私有类或接口,则是有意义的。一个例子: