我有一个叫做的程序MyProgram.java.我想从不同的目录运行它,它将在另一台机器上运行.所以我创建了一个目录并复制了MyProgram.class文件并创建了一个.bat运行它的文件(Run.bat),其中包含命令:@java MyProgram.
这不起作用,我必须复制SPVerification$1.class生成的Eclipse,以使其工作.
这些XXX$1.class文件是什么以及为什么我需要在XXX.class文件旁边运行应用程序?
The*_*bit 11
如果.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 :)");
}
}
Run Code Online (Sandbox Code Playgroud)
将生成以下文件
MyClass.class
MyClass$Inner1.class
MyClass$Inner2.class
MyClass$1.class
MyClass$2.class
Run Code Online (Sandbox Code Playgroud)
它们是匿名内部类。换句话说,当你有一个像这样的作品时
class OuterClass {
// ...
void method() {
Thread t = new Thread(new Runnable() {
// ... code implementing Runnable interface ...
});
// ... code to use t or whatever
}
}
Run Code Online (Sandbox Code Playgroud)
这会生成匿名内部类,在本例中实现接口Runnable,并且该类的编译代码会保存到一个OuterClass$<number>.class文件中。您可以拥有多个这样的类,并且 .class 文件名中的数量不断增加。
请注意,即使您使用匿名内部类扩展类而不是实现接口,语法也是完全相同的。这与创建命名类略有不同,您需要在适当的情况下使用implements和extends。