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

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

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

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

 Test.class Test$Inner.class 

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

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

哈瓦看看这里的匿名内部课

如果你的类包含一个私有内部类(不是匿名的),你也会得到像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 

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

构建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,如果你调用了新的Bar()。printMe它将打印“已定义”,在编译目录中你会找到Bar1.class

本节在上面的代码中:

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

被称为匿名内部类。