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

时间:2008-12-19 08:51:16

标签: java compiler-construction

如果我有一个内部课程,就像这样:

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

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

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

Test.class
Test$Inner.class

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

3 个答案:

答案 0 :(得分:22)

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

看看匿名的内部类部分here

答案 1 :(得分:9)

如果您的类包含私有内部类(非匿名),但是您在父类中的某个点实例化它,那么您也会得到类似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

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

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

以上代码中的这一部分:

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

被称为匿名内部类。