Javaのプログラムはコンパイルなしで動かせます

Java 11から単一ソースファイルのJavaプログラムをコンパイルなしで直接javaコマンドで実行できるようになっているので、紹介動画を作りました。

例えば次のようなJavaプログラムをHello.javaという名前で保存したとします。

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

このプログラムはファイル1つだけで完結しているので、javaコマンドで次のように実行できます。

>java Hello.java
Hello Java!

ここで、クラス名はMainですが、ファイル名がHello.javaになっていることに注意してください。

javacでコンパイルしようとするとエラーが出ます。

>javac Hello.java
Hello.java:1: エラー: クラス Mainはpublicであり、ファイルMain.javaで宣言する必要があります
public class Main {
       ^
エラー1個

拡張子が.javaではないファイルでも実行できます。
その場合は--sourceソースコードのバージョンを指定する必要があります。

C:\Users\naoki\Desktop>java --source 17 Hello.txt
Hello Java!

LinuxMacなどUNIX系のシステムではShebangという仕組みでJavaのソースファイルをコマンドのように実行できます。
次のようなファイルをhelloという名前で作ります。

#! /usr/bin/java --source 11
public class Main{
  public static void main(String[] args) {
     System.out.println("Hello Java!!!");
  }
}

最初の行で#!から始めてjavaコマンドのフルパスと--sourceでのバージョン指定を書きます。

chmodで実行権限をつけると、コマンドのように実行できます。

# chmod +x hello
# ./hello
Hello Java!!!

「プロになるJava」では「複数のソースファイルがからむときはコンパイルが必要」と、javacがいる場合を特別な場合として説明しています。 わざわざコマンドラインjavacするのはソースファイル1つの場合だし。