「Hello World」不必再写 public class 和 public static void main(String[] args)?这篇用三种环境编译运行十几种 main 写法,看哪些能跑、多个 main 同时存在时选谁、没有 class 的源文件会编译成什么。
传统 public static void main(String[] args)
JDK 21:传统
JDK 21+预览:传统
JDK 27:传统
static void main()(无参数,非 public)
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:static 无参
JDK 27:static 无参
实例 main:void main()
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:实例 main
JDK 27:实例 main
实例 main 带参数:void main(String[] a)
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:实例 main 参数个数 2
JDK 27:实例 main 参数个数 2
同时有 static main(String[]) 与 void main()
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:static(String[])
JDK 27:static(String[])
同时有 static void main() 与 void main(String[])
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:static 无参
JDK 27:实例(String[])
实例 main 需要无参构造器(构造器是 private)
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:Error: no non-private zero argument constructor found in class Hello remove private from e [rc=1]
JDK 27:Error: no non-private zero argument constructor found in class Hello remove private from e [rc=1]
实例 main 的类有带参数的构造器、没有无参构造器
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:Error: no non-private zero argument constructor found in class Hello remove private from e [rc=1]
JDK 27:Error: no non-private zero argument constructor found in class Hello remove private from e [rc=1]
main 继承自父类(父类里有 void main())
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:来自 Base 的 main
JDK 27:来自 Base 的 main
构造器里的输出先于 main(看构造与调用的顺序)
JDK 21:Error: Main method not found in class Hello, please define the main method as: public s [rc=1]
JDK 21+预览:构造器 main
JDK 27:构造器 main 顶层 void main() { println }(没有 class)
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:顶层 main
JDK 27:顶层 main
顶层字段与方法
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:hi tom
JDK 27:hi tom
顶层 main 里直接使用 java.util 类(不写 import)
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:编译失败 cannot find symbol
JDK 27:[1, 2, 3]
顶层 main 里使用 java.io.File 与 java.util.stream(不写 import)
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:编译失败 cannot find symbol
JDK 27:[2, 4, 6] x
IO.println(JDK 25 引入的 java.lang.IO)
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:编译失败 cannot find symbol
JDK 27:来自 IO
顶层 main 里的 this(未命名类的实例)
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:Hello 是否 final=true
JDK 27:Hello 是否 final=true
顶层 main 加上 static
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:顶层 static main
JDK 27:顶层 static main
顶层两个 void main()(重载 main(String[]))
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:有参
JDK 27:有参
同一个文件里顶层方法与一个具名类
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:main
JDK 27:main
顶层方法与 package 声明
JDK 21:编译失败 unnamed classes are a preview feature and are disabled by default.
JDK 21+预览:编译失败 unnamed class should not have package declaration
JDK 27:编译失败 compact source file should not have package declarationjava --enable-preview --source 21 Hello.java(JDK 21): source-launcher | Note: Hello.java uses preview features of Java SE 21. | Note: Recompile with -Xlint:preview for details. java Hello.java(JDK 27): source-launcher java --enable-preview --source 27 Hello.java(JDK 27): source-launcher javac(JDK 27)编译 Hello.java: 0 生成的类: ['Hello.class'] ;javap 的类声明: ['final class Hello'] ;方法: ['void main();'] ;major version 71 ;minor version 0 JDK 27:java Hello.java(源文件启动器,含编译)中位 256 ms;已编译的 java -cp Classic 25 ms