为什么编译器需要.java后缀但解释器不需要.class后缀?

时间:2011-12-28 02:05:59

标签: java

编译Foo.java: javac Foo.java

运行程序: java Foo

为什么编译器需要.java后缀但解释器不需要.class后缀?

5 个答案:

答案 0 :(得分:7)

正如其他几个答案所解释的那样,Java编译器将文件名作为参数,而解释器则采用类名。因此,您将.java扩展名赋予编译器,因为它是文件名的一部分,但您不会将其提供给解释器,因为它不是类名的一部分。

但是,你可能想知道,为什么他们不只是设计不同的Java解释器,以便它需要一个文件名?答案是,类并不总是从.class文件加载。有时它们来自JAR档案,有时它们来from the internet,有时它们是由程序动态构建的,依此类推。类可以来自任何可以提供所需二进制数据的源to define it。也许同一个类可能有不同来源的不同实现,例如程序可能会尝试从URL加载某个类的最新版本,但如果失败则会回退到本地文件。 Java的设计者认为,当您尝试运行程序时,您不必担心必须跟踪定义您正在运行的类的源。你只需要提供完全限定的类名,让Java(或者更确切地说,它的ClassLoader)努力找到它。

答案 1 :(得分:5)

Java编译器将文件名作为输入,因此使用Foo.java。

Java解释器获取完全限定的类名,并在类的路径和当前目录中搜索。如果你使用java Foo.class,它将搜索名为" class"的类。在包" Foo"中,如果类在默认包中,则返回NoClassDefFoundError,正如我从您的示例中所理解的那样

答案 2 :(得分:2)

Foo.java是文件名,而“Foo”只是类名(不是文件名)。默认的ClassLoader将在当前工作目录中搜索文件Foo.class并加载它。

答案 3 :(得分:1)

加入David Zaslavsky的解释:

java源代码也不一定来自.java文件。我们可以使用编译器从差异字符流中获取源代码,如API javax.tools.JavaCompiler

cmd行util javac恰好只使用文件源,所以它需要文件路径。

答案 4 :(得分:0)

每种语言都有语法和语义,可以在类似的各方之间建立规则和理解。就像英语中的单词,时态,动词等一样,简化了两个英语派对之间的交流。 Java规范建立了语法和语义,编译器只能理解java文件,而解释器只能理解.class文件。