3

我有一个名为MyProgram.java. 我想从将在另一台机器上运行的不同目录运行它。所以我创建了一个目录并复制MyProgram.class了文件并创建了一个.bat运行它的文件(Run.bat),其中包括命令:@java MyProgram.

这不起作用,我必须复制SPVerification$1.class生成Eclipse的内容才能使其正常工作。

这是什么XXX$1.class文件,为什么我需要在XXX.class文件旁边使用它们才能运行应用程序?

4

2 回答 2

12

如果您的 .java 文件具有内部/嵌套类,则编译后这些类将由 java 编译器生成为 Yourclass$xxx.class 文件。

内部类定义产生额外的类文件。这些类文件的名称结合了内部和外部类名称,例如 MyClass$MyInnerClass.class。-来源

示例编辑

考虑以下Class定义

// MyClass class
public class MyClass{

    // Inner class Test1
    class Inner1 {
    }

    // Inner class Test2
    class Inner2{
    }


    public static void main(String [] args) {

        // Anonymous inner class 1
        new Object() {
        };

        // Anonymous inner class 2
        new Object() {
        };

        System.out.println("Bunch of $ files :)");
    }
}

将生成以下这些文件

MyClass.class
MyClass$Inner1.class
MyClass$Inner2.class
MyClass$1.class
MyClass$2.class
于 2013-01-17T09:19:55.810 回答
5

它们是匿名的内部类。换句话说,当你有一个像

class OuterClass {
    // ...
    void method() {
        Thread t = new Thread(new Runnable() { 
            // ... code implementing Runnable interface ... 
        });
        // ... code to use t or whatever
    }
}

这会生成匿名内部类,在这种情况下实现Runnable接口,并且该类的编译代码进入OuterClass$<number>.class文件。您可以拥有多个这样的类,并且 .class 文件名中的数量会越来越多。

请注意,即使您使用匿名内部类扩展类而不是实现接口,语法也完全相同。这与创建命名类略有不同,您需要在哪里使用implementsextends酌情使用。

于 2013-01-17T09:21:26.550 回答