Java言語のプログラムの流れの要点
内容の確認日: 2026-10-03
この分野では、Java のプログラムを「書いて → コンパイルして → 実行する」までの流れと、Java という技術そのものの特徴が問われます。コードの細かい文法より、javac と java コマンドの使い分けや、JVM・JDK といった用語の意味を正確に覚えているかがポイントです。
出題項目は「Javaプログラムのコンパイルと実行」「Javaテクノロジーの特徴」「Javaプラットフォーム各エディションの特徴」の 3 つです。暗記で解ける問題が多い一方、選択肢の言い回しが紛らわしいので、なぜその答えになるのかまで理解しておきましょう。
コンパイルと実行の流れ
Java のプログラムは、ソースファイル (.java) を javac コマンドでコンパイルしてクラスファイル (.class) を作り、java コマンドで実行します。クラスファイルの中身は、特定の OS や CPU に依存しないバイトコードです。
javac Main.java # Main.java をコンパイルして Main.class を作るjava Main # クラス Main を実行する (.class は付けない)javac に渡すのはファイル名 (拡張子 .java まで書く)、java に渡すのはクラス名です。java Main.class と書くと「Main.class という名前のクラス」を探してしまい、メインクラスが見つからないエラーになります。試験ではこの違いが繰り返し問われます。
パッケージに属するクラスは、java com.example.Main のようにパッケージ名を含めた完全修飾名で指定します。このとき、カレントディレクトリ (クラスパス) の下に com/example/Main.class が置かれている必要があります。
Java SE 11 からは、1 つのファイルで完結するプログラムなら、javac を使わずに java Main.java とソースファイルを直接指定して実行することもできます。この場合はメモリ上でコンパイルされ、クラスファイルは作られません。
main メソッドの条件とコマンドライン引数
java コマンドで実行を始める場所 (エントリポイント) になるのは、次の条件をすべて満たす main メソッドです。
・public である
・static である
・戻り値が void である
・String の配列を 1 つ受け取る
修飾子 public と static の順番は入れ替えても構いません。引数の名前も args である必要はなく、String... args のような可変長引数でも条件を満たします。
public class Main { static public void main(String[] a) { System.out.println("static public の順でも実行できます"); }}java Main static public の順でも実行できます
java Main Java Bronze のようにクラス名の後ろに文字列を並べると、それがコマンドライン引数として main メソッドの配列に入ります。区切りは空白で、クラス名そのものは配列に含まれません。
public class Main { public static void main(String[] args) { System.out.println("引数の数: " + args.length); System.out.println("1つ目: " + args[0]); }}java Main Java Bronze 引数の数: 2 1つ目: Java
引数を渡さずに java Main と実行すると、配列は null ではなく長さ 0 の配列になります。そのため args[0] を読んだところで例外が発生します。直前の args.length の出力までは実行される点にも注意してください。
public class Main { public static void main(String[] args) { System.out.println("引数の数: " + args.length); System.out.println("1つ目: " + args[0]); }}java Main 引数の数: 0
実行時に例外が発生: ArrayIndexOutOfBoundsException
ソースファイル名とクラスのルール
public なクラスは、クラス名と同じ名前のソースファイルに書く必要があります。public class MyApp なら MyApp.java です。大文字・小文字も一致していなければならず、違うとコンパイルエラーになります。
1 つのソースファイルには複数のクラスを書けますが、public にできるのは 1 つだけです。コンパイルすると、クラスごとに別々のクラスファイルが作られます。次のコードを javac Main.java でコンパイルすると、Main.class と Greeter.class の 2 つができます。
class Greeter { String greet(String name) { return "Hello, " + name; }}public class Main { public static void main(String[] args) { Greeter g = new Greeter(); System.out.println(g.greet("Java")); }}java Main Hello, Java
Java テクノロジーの特徴
プラットフォームに依存しない: javac が作るバイトコードはどの OS でも共通で、OS ごとに用意された JVM (Java 仮想マシン) がそれを実行します。一度書いたプログラムがどこでも動くことを「Write Once, Run Anywhere」と呼びます。JVM が実行するのはソースコードではなくバイトコードです。よく使われる部分は JVM の中の JIT コンパイラがネイティブコードに変換し、高速に実行します。
JDK と JRE: JDK (Java Development Kit) は javac などの開発ツールと実行環境をまとめたもので、プログラムを作るには JDK が必要です。JRE (Java Runtime Environment) は実行に必要な JVM と標準ライブラリだけで、コンパイラは含みません。
静的型付け: 変数や引数の型はコンパイル時にチェックされ、型の誤りはプログラムを動かす前にコンパイルエラーとして見つかります。
public class Main { public static void main(String[] args) { int count = "10"; System.out.println(count); }}javac Main.java
コンパイルエラー (3 行目): 文字列 (String) は int 型の変数に代入できない
ガベージコレクション: どこからも参照されなくなったオブジェクトは、JVM が自動的にメモリを解放します。C 言語の free や C++ の delete のように、プログラマがメモリを解放する命令はありません。System.gc() はガベージコレクションの実行を JVM に要求するだけで、すぐに実行される保証はありません。
オブジェクト指向だが、すべてがオブジェクトではない: int・double・boolean などのプリミティブ型の値はオブジェクトではありません。クラスの継承は 1 つのクラスからだけ (単一継承) で、複数の型を持たせたいときはインタフェースを使います。
その他: ポインタ演算がない (メモリを直接操作できない)、言語と標準 API がマルチスレッドに対応している、といった点もよく選択肢に出ます。
Java プラットフォームのエディション
Java は用途に応じて 3 つのエディションに分かれています。
・Java SE (Standard Edition): 言語仕様・JVM・基本的な標準 API (java.lang、java.util など) を含む標準のエディション。デスクトップやコマンドラインのアプリケーションなど、一般的な開発に使う
・Java EE (Enterprise Edition): Java SE に、サーブレットやデータベース連携など、Web・企業向けのサーバーサイド開発の API を追加したもの。現在は Eclipse Foundation に移管され Jakarta EE という名前になっている
・Java ME (Micro Edition): 組み込み機器や小型デバイスなど、メモリや CPU の限られた環境向け
SE がすべての土台で、EE は SE の「上に」機能を足したもの、という関係を押さえておきましょう。「EE には SE の機能が含まれない」「ME はサーバー向け」といった選択肢は誤りです。
試験でよくある引っかけ
javaコマンドに.classを付けるjava Main.classはエラーです。javaに渡すのはファイル名ではなくクラス名なのでjava Mainと書きます。javacに拡張子を付けないjavac Mainではコンパイルできません。javacにはソースファイル名を.javaまで書きます。mainメソッドの修飾子の順番static public void main(String[] args)も正しいエントリポイントです。一方、Java SE 11 ではstaticのないmainは、コンパイルはできてもjavaコマンドで実行できません。引数がないときの
args引数を渡さないと
argsはnullではなく長さ 0 の配列です。args.lengthは 0 になり、args[0]で例外が発生します。System.gc()で必ずメモリが解放されるSystem.gc()は実行の要求にすぎません。いつガベージコレクションが動くかは JVM が決めます。ファイル名とクラス名の大文字・小文字
public class MyAppをmyapp.javaに書くとコンパイルエラーです。大文字・小文字まで一致させます。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Oracle University 日本「1Z0-818-JPN (Java SE Bronze) 試験」
- Java SE 11 ツール・リファレンス「java」
- Java 言語仕様 (Java SE 11) 12.1.4「Invoke Test.main」
- JEP 330: Launch Single-File Source-Code Programs
コード例は、試験の対象バージョンで実際にコンパイル・実行して結果を確認しています。