.class文件中的$符号

Mar*_*oun 3 java class

我有一个叫做的程序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)

  • 特别是XXX $ 1是*匿名内部类* (7认同)

hyd*_*yde 5

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

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 文件名中的数量不断增加。

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