Java编译小问题,详细情况如下

public class Hello{
public static void main(String[] args){
System.out.println("Hello");
}
}

javac Hello.java
java Hello

问题:
第一点为什么一个java文件中只能有一个公共类
第二点编译后使用运行指令java后面的Hello,是Hello这个类呢?还是代表Hello.java这个文件
输入java Hello.java
java Hello.class
都会出现错误。
忘前辈指导。

第一点:编译器限制,没有为什么
第二点:类
输入 java Hello

1、可以包含多个类,但是编译的时候会自动的分成多个.class文件。只允许有一个公共类,且公共类名与Java源文件名相同。
2、.java文件只是一个用来存放源代码的文本格式文件,.class文件是经编译后产生的类文件,运行的是.class文件
3、输入改为java Hello

第一点为什么一个java文件中只能有一个公共类
因为Java不像C#那样拥有命名空间。它可能早期在设计的时候偷懒,直接用文件结构当作命名空间了。
比如说你有一个项目。
yourcompany.app.mainprogram,就必须放在yourcompany\app\mainprogram.java中,你有一个yourcompany.app.utility.helper类,就必须建一个
utility的文件夹,再把helper.java放在里面。
那为什么C#有命名空间呢?我猜想啊,你姑妄听之。那是因为C#是区分大小写的,可是Windows文件系统则不区分。这使得如果C#抄袭Java,面对诸如:
class A和class a这样两个类,就搞不定了。干脆,C#使用了命名空间。
有了命名空间,就不再需要利用文件系统的一一对应关系了,也就没必要一个类放在一个文件里了。

是Hello这个类呢?还是代表Hello.java这个文件
其实没什么区别,因为Java的文件和类是一一对应的。换言之,Hello.java就是Hello类,不可能是别的类。反之也一样。
既然如此,应该是java Hello

多看看基础就不会有这种问题提出了....

这是它这个语言本身的规定,第二个运行的其实是.class文件

javac 这里是 一个虚拟机要装载的 类,考虑到 资源优先搜索,以及类之间的调用关系 必须是public 才可以,否则 混乱,
java 这里是 一个 编译成功的类的 字节码,编译成功的 类 是 独立的名字,而且 内在的执行逻辑已经在编译的过程中确定了,只要 路径正确,一般都可以
正常 执行出结果来。,