编译 Foo.java:javac Foo.java
运行程序:java Foo
为什么编译器需要.java
后缀但解释器不需要.class
suffix?
正如其他几个答案所解释的那样,Java 编译器采用文件名作为参数,而解释器采用类名。所以你给.java
编译器的扩展名,因为它是文件名的一部分,但您不会将其提供给解释器,因为它不是类名的一部分。
但是,您可能会想,为什么他们不以不同的方式设计 Java 解释器,以便它采用文件名呢?答案是类并不总是从.class
文件。有时它们来自 JAR 档案,有时它们来自来自网络 http://docs.oracle.com/javase/7/docs/api/java/net/URLClassLoader.html,有时它们是由程序即时构建的,等等。类可以来自任何可以提供所需二进制数据的源定义它 http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#defineClass%28java.lang.String%2C%20byte%5B%5D%2C%20int%2C%20int%29。也许同一个类可能有来自不同来源的不同实现,例如,程序可能会尝试从 URL 加载某个类的最新版本,但如果失败,则会回退到本地文件。 Java 的设计者认为,当您尝试运行一个程序时,您不必担心必须追踪定义您正在运行的类的源代码。你只需给出完全限定的类名并让 Java(或者更确切地说,它的ClassLoader
s) 努力寻找它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)