使用 java 与使用 jdk11 的 javac 执行单个代码 java 文件

Executing the single code java file using java Vs javac using jdk11

我正在使用 JDK11。下面是我的示例 class -

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

我在以下情况下使用命令“java filename.java”执行了上述 class

ColumnA -> Class 声明为 public? ColumnB -> 文件名与 class 名称相同?

ColumnA ColumnB Result
  Yes      Yes   Yes
  No       Yes   Yes
 *Yes      No    Yes
  No       No    Yes

对于所有场景,命令执行成功,我得到了结果。如果我 运行 文件名上的“javac”命令,我会得到“是-否”情况的编译时错误。

  1. 为什么我在文件名上执行“java”命令时没有出现编译时错误?

  2. 我在一个代码文件中有多个 public class。我可以使用“java filename.java”命令执行文件。当 运行 使用“java”命令编译文件时,我缺少编译时问题。请帮我解决这个问题。

您所有问题的答案都可以在 JEP 330 中找到。我相信以下摘录可以回答您的问题。

the first class found in the source file is executed

The source file should contain one or more top-level classes, the first of which is taken as the class to be executed

The compiler does not enforce the optional restriction defined at the end of JLS §7.6, that a type in a named package should exist in a file whose name is composed from the type name followed by the .java extension

换句话说,当您使用 javac 编译 java 源代码文件时,源代码文件 必须 包含单个“public" class 其名称与文件名称匹配。但是当你使用java命令运行一个java源代码文件时,上述限制不适用。

The class to be executed is the first top-level class found in the source file. It must contain a declaration of the standard public static void main(String[]) method.