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

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

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

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

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

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

(这与javac不同,因为这个程序专门接受源文件并将它们编译成字节码。)

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

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

当你执行“ java test.class ”时

你得到了

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

要么

线程“main”中的exceptionjava.lang.NoClassDefFoundError:test / class

这是因为“ java java test.class ”中的“ java test.class ”是jvm 。 它在类中寻找称为“ class ”的主方法而不是“ test ”。 “ java test.class ”中的点具有重要意义。 那么jvm如何看待“ java test.class ”,在一个名为“ test ”的包中,它寻找一个名为“ class ”的java类。

 *test.class* *test* - package name *class* - java filename 

希望这可以帮助 !!

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

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

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