为什么我们不使用带有“java”命令的.class扩展名?

时间:2013-07-17 15:06:17

标签: java

为什么我们不在filename.class命令之后提供java文件,而不仅仅是filename

假设我们要编译test.java程序,然后运行javac test.java。没关系!

之后它会生成test.class个文件,但要运行该程序,我们会运行java test而不是java test.class。这是什么原因?

6 个答案:

答案 0 :(得分:20)

因为您没有描述要运行的文件。您告诉Java哪个包含main方法 - 类名称(在您的情况下)是filename,而不是filename.class

字节码几乎总是包含在文件系统的文件中这一事实是一个实现细节。传递给java命令的类路径告诉它 where 查找类,然后main类参数告诉它使用哪个类。

javac不同,因为此程序专门采用源文件并将它们编译为字节码。)

答案 1 :(得分:6)

您也不会将文件名传递给java命令。您传递一个完全限定的类名。像com.yourcompany.yourapp.Main这样的东西。然后,Java通过查看类路径中的所有目录和jar文件,找到此类名的.class文件。

答案 2 :(得分:1)

这是一个实现细节。 Java类加载器系统可以通过自定义代码进行扩展,以使其行为不同。例如,一些公司已经编写了加密的类加载器,它们能够动态地解密和加载加密的类文件。你可以假设创建一个类似的系统,将一堆类组合成一个类似.NET程序集的东西,而不是Jar文件(实际上只是一个zip文件)。

答案 3 :(得分:0)

执行" java test.class "

你得到

  

无法找到或加载主类test.class

  

线程中的异常" main" java.lang.NoClassDefFoundError:test / class

这是因为" java" in" java test.class"是jvm。它在类中寻找主要方法" class"而不是" test"。点'" java test.class"具有重要意义。那么jvm在一个名为" java test.class"的软件包中如何查看" test"它查找名为" class"。

的java类
*test.class*

*test* - package name

*class* - java filename

希望这会有所帮助!!

答案 4 :(得分:0)

只是对所有细节进行总结,

什么时候做

java filename.java
实际上,他运行Java编译器并将代码转换为JVM可以理解的指令。

现在一个人跑步

javac main_file

/ s调用JVM来运行整个项目,该项目的主要方法在类 main_file

main_file 实际上是该类的完全限定名称,即,如果我有一个ProjectX,并且该主类位于 src.java.hello.main 包中,
您应该运行命令

java src.java.hello.main.main_file

因此,.实际上是在JVM端保留的东西,我们不能将.class作为 java 命令的参数的一部分。

答案 5 :(得分:-1)

Javac编译器创建名为Xyz.class的文件(这里Xyz是FileName) 包含程序的字节版本 Java Bytecode只是程序的中间表示,包含Java解释器将执行的指令 因此,javac的输出不是可以直接执行的代码

简而言之,javac关键字用于编译Java程序 如果我们使用.class与javac(已经编译的文件.class文件)然后如何编译已经编译文件

所以有效语法是: Javac Xyz.java(编译Java程序) java Xyz(运行Java程序)