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

时间:2012-08-12 07:43:45

标签: java

从命令行运行基本的java程序是一个3个步骤:

  1. 编写代码:

    public class HelloWorld { public static void main(String [] args){     System.out.println(“Hello,World”); } }

  2. javac HellWorld.java进行编译,检查错误&生成HelloWorld.class个文件。

  3. 通过提供班级名称来运行代码 - > java HelloWorld

  4. 现在, 我很想知道原因:

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

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

    如果我们只给出类名为Vs classname 文件扩展名,那会有什么影响?

3 个答案:

答案 0 :(得分:6)

  

如果我们只给出带有文件扩展名的类名Vs classname,那会有什么不同?

您为java二进制文件提供的参数不是文件名。它应该是一个类名。因此,特别是,如果您尝试在包Baz中启动名为foo.bar的类,则可以运行:

java foo.bar.Baz

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

基本上,您不应将参数视为文件名 - 您应将其视为完全限定的类名。哎呀文件系统上可能没有简单的Baz.class文件 - 它可能隐藏在一个jar文件中。

答案 1 :(得分:1)

  

如果我们只给出带有文件扩展名的类名Vs classname,那会有什么不同?

这是因为它就是这样。自Java 1.0以来,Sun / Oracle已经实现了java命令以便以这种方式工作,并且更改它将会造成巨大的破坏性。

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

答案 2 :(得分:0)

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