Java の概要と簡単なJavaプログラムの作成の要点
内容の確認日: 2026-10-04
この分野では、Java のプログラムを作って動かすための「入口」まわりの知識が問われます。Bronze と重なる内容もありますが、Silver では javac と java のオプション (-d・-cp)、ソースファイルモード、import が衝突したときの扱いなど、一歩踏み込んだ知識が必要です。
出題項目は「main メソッドを持つ実行可能な Java プログラムの作成」「コマンドラインでの Java プログラムのコンパイルと実行」「パッケージの使用 (パッケージ宣言とインポート)」の 3 つです。
main メソッドの条件
java コマンドがプログラムの実行を始めるエントリポイントは、public static void main(String[] args) の形のメソッドです。次の書き方も、すべて正しいエントリポイントになります。
・static public void main(String[] args) (修飾子の順番は自由)
・public static void main(String... args) (可変長引数)
・public static final void main(String[] a) (final を付けてもよい。引数名も自由)
・public static void main(String args[]) (配列の [] を変数名の後ろに書く)
一方、private を付けた main、static のない main、戻り値が int の main などもコンパイルは通りますが、Java SE 17 の java コマンドはエントリポイントとして認めず、実行時にエラーになります。「コンパイルエラー」と「実行時のエラー」を区別して覚えましょう。
main という名前でも、引数が違えば普通のメソッドとしてオーバーロードできます。java コマンドが最初に呼ぶのは、String 配列を受け取る main だけです。
public class Main { public static void main(String... args) { System.out.println("main(String...)"); main(5); } static void main(int n) { System.out.println("main(int): " + n); }}java Main main(String...) main(int): 5
コマンドライン引数は、クラス名の後ろに空白で区切って書いた値が、String の配列として渡されます。引数を付けずに実行した場合は、null ではなく要素数 0 の配列が渡されます。
public class Main { public static void main(String[] args) { System.out.println(args.length); for (String a : args) { System.out.println(a.toUpperCase()); } }}java Main silver gold 2 SILVER GOLD
javac と java のオプション
javac の -d オプションは、クラスファイルの出力先を指定します。パッケージに属するクラスは、出力先の下にパッケージの階層どおりのディレクトリが作られて、そこに置かれます。ソースファイルがどのディレクトリにあるかは関係ありません。
# src/Main.java の先頭に package com.example.app; と書いてある場合javac -d classes src/Main.java# → classes/com/example/app/Main.class が作られるjava -cp classes com.example.app.Main-cp (-classpath・--class-path も同じ意味) は、クラスファイルや JAR ファイルを探す場所 (クラスパス) を指定するオプションで、javac と java のどちらでも使えます。複数指定するときの区切りは、macOS・Linux では :、Windows では ; です。java に渡すのは、ディレクトリのパスではなく完全修飾名 (com.example.app.Main) です。
Java SE 11 からは、1 つのソースファイルで完結するプログラムを java Main.java のように直接実行できます (ソースファイルモード)。このモードでは、ソースはメモリ上でコンパイルされ、クラスファイルは作られません。ファイルに複数のクラスがある場合は、ファイルの最初に書かれたクラスの main が実行されます。ファイル名とクラス名が一致している必要もありません。
パッケージ宣言
package 宣言は、ソースファイルの最初の文として 1 つだけ書けます。その前にはコメントと空行しか書けません。import 文は package 宣言の後、クラス宣言の前に書きます。
// コメントは package より前に書いてもよいpackage com.example.app;import java.util.List;public class Main {}package 宣言のないクラスは、名前のない無名パッケージに属します。無名パッケージのクラスは、名前付きパッケージのクラスから import できません。
import の種類と優先順位
import には、クラス名まで書く単一型インポート (import java.util.List;) と、* でパッケージ内のクラスをまとめて使えるようにするオンデマンド・インポート (import java.util.*;) があります。* で使えるようになるのは、そのパッケージ直下のクラスだけで、サブパッケージ (java.util.function など) のクラスは含まれません。
java.lang パッケージ (String・Math・Integer・System など) と、自分と同じパッケージのクラスは、import なしで使えます。また、import はクラス名を短く書くための仕組みにすぎないので、java.util.List のように完全修飾名で書けば import は要りません。
同じ名前のクラスが複数のパッケージにある場合は注意が必要です。例えば Date は java.util と java.sql の両方にあります。両方をオンデマンド・インポートして Date と書くと、どちらか決められずコンパイルエラーになります。
import java.util.*;import java.sql.*;public class Main { public static void main(String[] args) { Date d = null; System.out.println(d); }}javac Main.java
コンパイルエラー (6 行目): Date が java.util と java.sql のどちらのクラスか決まらない
このとき、どちらかを単一型インポートで指定すると解決します。単一型インポートはオンデマンド・インポートより優先されるためです。
import java.util.*;import java.sql.*;import java.util.Date;public class Main { public static void main(String[] args) { Date d = new Date(0); System.out.println(d.getClass().getName()); }}java Main java.util.Date
import static を使うと、クラスの static なメンバーを、クラス名を付けずに使えるようになります (static インポート)。import static java.lang.Math.*; のように * でまとめて指定することもできます。
import static java.lang.Math.max;public class Main { public static void main(String[] args) { System.out.println(max(3, 7)); }}java Main 7
試験でよくある引っかけ
コンパイルできても実行できない
mainprivateやstaticなしのmainはコンパイルは通りますが、javaコマンドで実行するとエラーになります。引数なしの
args引数を付けずに実行しても
argsはnullではなく要素数 0 の配列です。-dの出力先-d classesを付けると、パッケージの階層に合わせてclasses/com/example/...にクラスファイルが作られます。ソースファイルの場所は関係ありません。ソースファイルモードで実行されるクラス
java Main.javaで実行されるのは、ファイルの最初に書かれたクラスのmainです。オンデマンド・インポートの範囲
import java.util.*;ではjava.util.function.Functionなどサブパッケージのクラスは使えません。同じ名前のクラスのインポート
java.util.*とjava.sql.*の両方でDateを使うとコンパイルエラーです。単一型インポートを追加すると、そちらが優先されます。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Oracle University 日本「Java SE 17 Programmer I (1Z0-825-JPN) 試験」
- Java SE 17 ツール・リファレンス「javac」
- Java SE 17 ツール・リファレンス「java」
- Java 言語仕様 (Java SE 17) 7.5「Import Declarations」
コード例は、試験の対象バージョンで実際にコンパイル・実行して結果を確認しています。