为了让更多新手快速体验 Java,多年来 Java 偷偷做了这个改进
作为一个准备入门 Java 的新手程序员来说,第一件事儿可能就是要下载一个 IDEA ,如果说有什么 IDE 比 IDEA 还大的话,那恐怕也就是 Visual Studio 了。下载完了还可能一头懵,不知道从何下手。
记得我刚接触 Java 的时候,那时候我还在做 .NET(C#) ,然后对 Python 也比较熟悉。
对于 Python 来说,一个新手装完 Python ,连 IDE 都不用装,就可以在终端中用命令行的方式体验一下交互式编程了,写个 Hello World 也就算了入门了。
而对于 C# 来说,虽说 Visual Studio 好几个G,但是装完之后,一切也就准备好了,建一个命令行项目,写个 Hello World 也算入门了。
但是当初我刚下载完 IDEA 之后,准备建一个命令行应用,找了半天没找到(我以为根本没这个选项,直到很久之后我才发现用 IDEA 怎么创建命令行应用)。结果,我本就准备写个 Hello World 体验一下,发现还要用 Maven 或 Gradle 创建,要知道对于一个 Java 都没入门的人来说,Maven 和 Gradle 只会让人更加糊涂。
如果不用 Maven 或 Gradle 呢,创建一个 java 文件,还要用javac
编译。javac
是什么好像更让人迷糊了。
Java 也考虑到这个问题了,让准备入门或体验Java的同学,能够以更快、更简单的方式尝试一下 Hello World,不用下载 IDE,不用自己手动编译,只要抄一段 Hello World,直接一个java 命令运行就好了,像 Python 一样简单。
Java 8 确实有些麻烦
假设我们抄了一段 Java 代码,一个Moon.java
类,里面一个main
方法,输出一个Hello
。
public class Moon {
public static void main(String[] args) {
System.out.println("Hello");
}
}
没有 IDE 的情况下,我们尝试了一下java Moon
、java Moon.java
。
发现都不行,所以,如果我们想要运行Moon
的main
方法,要先用javac
进行编译。
javac Moon.java
编译成功后,会在Moon.java
的目录中出现一个Moon.class
的编译后的文件,这个就是字节码文件,JVM 只认这种格式。
然后我们在用java
命令来执行Moon
类,才能够执行成功。
java -classpath . Moon
这时,就能看到main
方法执行成功了,注意其中的-classpath .
参数是告诉 Java 去当前目录查找类文件 Moon
。
现在改的稍微复杂一些了,新加了一个类文件。
Helper.java
文件
public class Helper {
public static void sayHello() {
System.out.println("Hello");
}
}
然后Moon.java
类在main
方法中调用 Helper.sayHello 方法。
public class Moon {
public static void main(String[] args) {
Helper.sayHello();
}
}
那之后再编译的话,就要把这两个 Java 文件都包含在javac
的命令中。
javac Moon.java Helper.java
之后仍然可以正常运行java -classpath . Moon
JDK 11 之后
而在 JDK 11 之后,就没这么麻烦了,有点像 Python 那种解释型语言了,直接写完就可以运行了。
仍然是那个输出Hello
的Moon
类。
public class Moon {
public static void main(String[] args) {
System.out.println("Hello");
}
}
直接执行java Moon.java
就行了。
但是,问题来了,如果是两个文件,就像 JDK 8 的那个例子,Moon.java
调用了另一个Helper.java
的方法,大于1个类文件的情况,那还是不行,仍然还是要先编译。
JDK 22 之后
前几天 JDK22 已经发布了,我一看,嘿,JDK22竟然又做了调整,解决了多个文件调用的问题。
Moon.java
调用了另一个Helper.java
的方法,现在,我们怎么做呢。
直接java Moon.java
,然后就可以了。
这是因为增强了 java 启动器的源文件模式,以便能够运行作为多个 Java 源代码文件提供的程序。