一、简介
JEP330-启动单文件代码程序(Launch Single-File Source-Code Programs),是JDK11中一个很不错的功能。这个功能允许你直接使用java解析器运行java代码,java文件会在内存中执行编译并且直接执行。唯一的约束在于所有相关的类必须定义在东一个java文件中。
二、实例
案例1
创建一个 Test.java 文件 ,代码如下:
public class Test {
public static void main(String[] args) {
System.out.println("Test ...");
}
}
执行上面的代码
jdk11之前 :
javac Test.java
java Test
jdk11:
java Test.java
结论:jdk11中,通过 java xxx.java 命令,就可直接运行源码文件程序,而且不会产生.class 文件。
案例2
问题:如果一个java文件中存在多个类 ,通过 java xxx.java 运行源码文件,会执行哪一个main方法 ?
创建一个 Test1.java 文件,代码如下:
class Test2 {
public static void main(String[] args) {
System.out.println("Test2");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("Test");
}
}
通过 java Test.java 运行后输出 "Test2"。
下面我们颠倒 Test Test2 两个类的位置:
public class Test {
public static void main(String[] args) {
System.out.println("Test");
}
}
class Test2 {
public static void main(String[] args) {
System.out.println("Test2");
}
}
通过 java Test.java 运行后输出 "Test"。
结论:一个java文件中包含多个类时,java xxx.java 执行排在最上面的一个类的main方法。
案例3
问题:如果一个java文件中类的方法中调用了另一个java文件中类的方法,通过 java xxx.java 运行源码文件,能运行通过吗 ?
创建两个java文件 Student.java 、Teacher.java。
Student.java:
public class Student {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.toString();
}
}
Student.java:
public class Teacher {
private String name;
private String subject;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setSubject(String subject){
this.subject = subject;
}
public String getSubject(){
return subject;
}
}
执行 java Student.java 报错 :
Student.java:4: 错误: 找不到符号
Teacher teacher = new Teacher();
^
符号: 类 Teacher
位置: 类 Student
Student.java:4: 错误: 找不到符号
Teacher teacher = new Teacher();
^
符号: 类 Teacher
位置: 类 Student
2 个错误
把 Student 和 Teacher 连个类 放在一个java文件中 ,重新运行,运行通过。
结论:java xxx.java 启动单个Java源代码文件的程序时,相关个类必须定义在同一个java文件中。
三、结论
通过上面的三个案例,我得出以下结论:
- jdk11中,通过 java xxx.java 命令,就可直接运行源码文件程序,而且不会产生.class 文件。
- 一个java文件中包含多个类时,java xxx.java 执行排在最上面的一个类的main方法。
- java xxx.java 启动单个Java源代码文件的程序时,相关个类必须定义在同一个java文件中。