【问题标题】:Why does Java code with an inner class generates a third SomeClass$1.class file? [duplicate]为什么带有内部类的 Java 代码会生成第三个 SomeClass$1.class 文件? [复制]
【发布时间】:2008-12-19 08:51:16
【问题描述】:

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

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

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

当我编译它时,我希望它应该生成两个文件:

Test.class
Test$Inner.class

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

【问题讨论】:

  • 你能解释一下为什么你没有看到 Test.class 和 Test$Inner.class 吗?我假设在同一个包中还有另一个 SomeClass 生成了你看到的类文件?

标签: java compiler-construction


【解决方案1】:

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

看看匿名内部类部分here

【讨论】:

  • 请注意,内部类的名称未指定,因此它们不必采用这种形式,依赖它会是一个错误。但话虽如此,我还没有看到生成不同名称的编译器。
【解决方案2】:

如果您的类包含私有内部类(非匿名)但您在父类中的某个位置实例化它,您还会得到类似 SomeClass$1.class 的信息。

例如:

public class Person {

    private class Brain{
        void ponderLife() {
            System.out.println("The meaning of life is...");
        }
    }

    Person() {
        Brain b = new Brain();
        b.ponderLife();
    }
}

这将产生:

Person.class
Person$Brain.class
Person$1.class

我个人认为这比典型的匿名类更容易阅读,尤其是在实现简单接口或仅用于传递给另一个本地对象的抽象类时。

【讨论】:

【解决方案3】:

建立在 hhafez 上:SomeClass$1.class 代表匿名内部类。 这种类的一个例子是

public class Foo{
  public void printMe(){
    System.out.println("redefine me!");
  }
}


public class Bar {
    public void printMe() {
    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };
    f.printMe();
    }
}

从一个普通的 Main,如果你调用 new Bar().printMe,它会打印“defined”,在编译目录中你会找到 Bar1.class

以上代码中的这一段:

    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };

被称为匿名内部类。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2015-08-24
    • 2013-10-07
    • 1970-01-01
    • 2019-09-19
    • 2012-06-24
    相关资源
    最近更新 更多