java编译:classname Vs带有文件扩展名的classname

java compilation: classname Vs classname with file-extension

从命令行运行基本Java程序是一个3步过程:

  • 编写代码:

    公共类地狱世界{公共静态void main(string[]args){system.out.println("你好,世界");}}

  • javac HellWorld.java编译,检查错误并生成HelloWorld.class文件。

  • 通过给出类名-->java HelloWorld来运行代码

  • 现在,我很好奇为什么:

    java HelloWorld有效,但是当我们给出类文件的完整路径时,它会抛出一个错误。

    1
    2
    $ java HelloWorld.class
    Error: Could not find or load main class HelloWorld.class

    如果我们只给出类名和具有文件扩展名的类名,有什么区别?


    What does it make a difference if we give just the classname Vs classname with file-extension?

    您提供给java二进制文件的参数并不意味着是文件名。它是一个类名。因此,特别是,如果您试图在包foo.bar中启动一个名为Baz的类,那么您将运行:

    1
    java foo.bar.Baz

    同样地,如果您试图运行java HelloWorld.class,就好像您试图在HelloWorld包中运行一个名为class的类,这是不正确的。

    基本上,您不应该将参数视为文件名—您应该将其视为完全限定的类名。检查文件系统中甚至可能没有一个简单的Baz.class文件—它可能隐藏在JAR文件中。


    What does it make a difference if we give just the classname Vs classname with file-extension?

    这是因为它就是这样。Sun/Oracle已经实现了EDCOX1的0指令,以便从Java 1开始工作,并且改变它将是巨大的破坏性的。

    如jon所说,该命令的参数是完全限定的类名,而不是文件名。实际上,名为HelloWorld.class的文件很可能不存在。它可能是JAR文件的成员…或者在某些情况下,任何事情。


    在Java编程语言中,源文件(.java文件)编译成具有类扩展的(虚拟)机器可读类文件。