import 文(Java)
『Java』でクラスやインターフェースを利用するときに必要な import 文の書き方を解説します。個別インポートとワイルドカードインポートの違い、static import の使い方、java.lang パッケージが省略できる理由、そしてIDEを使ったインポート管理の概要まで順を追って説明します。
構文
// 個別インポート:クラスを1つずつ指定します import パッケージ名.クラス名; // ワイルドカードインポート:パッケージ内の全クラスをまとめてインポートします import パッケージ名.*; // staticインポート:staticメンバー(定数・メソッド)をクラス名なしで使えるようにします import static パッケージ名.クラス名.staticメンバー名; // staticワイルドカードインポート:クラスの全staticメンバーを対象にします import static パッケージ名.クラス名.*;
個別インポートとワイルドカードインポートの違い
| 比較項目 | 個別インポート | ワイルドカードインポート(*) |
|---|---|---|
| 書き方 | import java.util.ArrayList; | import java.util.*; |
| 対象 | 指定したクラス1つ | パッケージ直下の全クラス |
| サブパッケージ | 対象外 | 対象外(java.util.* は java.util.concurrent を含まない) |
| コンパイル後のサイズ | 変わらない | 変わらない(使われたクラスのみコンパイルされる) |
| 名前衝突のリスク | 低い | 高い(異なるパッケージに同名クラスがあると曖昧になる) |
| 一般的な使われ方 | 個別インポート(IDEが自動管理することが多い) | プロジェクト方針による |
java.lang パッケージが省略できる理由
java.lang パッケージは String・System・Math・Integer など Java の根幹をなすクラスが集まっています。このパッケージはコンパイラが自動的にインポートするため、import java.lang.*; と書く必要はありません。それ以外のパッケージ(java.util・java.io・java.nio など)は明示的に import を書く必要があります。
| クラス例 | パッケージ | import の要否 |
|---|---|---|
String | java.lang | 不要(自動インポート) |
System | java.lang | 不要(自動インポート) |
Math | java.lang | 不要(自動インポート) |
ArrayList | java.util | 必要 |
HashMap | java.util | 必要 |
Files | java.nio.file | 必要 |
サンプルコード
ImportBasic.java
// 個別インポートとワイルドカードインポートの基本的な使い方を示します
// 呪術廻戦の呪術師データをリストとマップで管理します
import java.util.ArrayList; // 個別インポート:ArrayListだけを指定しています
import java.util.HashMap; // 個別インポート:HashMapだけを指定しています
import java.util.List; // インターフェースもimportが必要です
import java.util.Map;
// import java.util.*; と書いてもコンパイル結果は同じですが、
// 個別インポートの方が「どのクラスを使っているか」が一目でわかります
public class ImportBasic {
public static void main(String[] args) {
// ArrayListにキャラクター名を追加します
List<String> sorcerers = new ArrayList<>();
sorcerers.add("虎杖悠仁");
sorcerers.add("伏黒恵");
sorcerers.add("釘崎野薔薇");
sorcerers.add("五条悟");
System.out.println("=== 呪術師一覧 ===");
for (String name : sorcerers) {
System.out.println(name);
}
// HashMapで等級を管理します
Map<String, String> gradeMap = new HashMap<>();
gradeMap.put("五条悟", "特級");
gradeMap.put("乙骨憂太", "特級");
gradeMap.put("虎杖悠仁", "1級");
gradeMap.put("七海建人", "1級");
System.out.println("=== 等級確認 ===");
// String と System は java.lang パッケージなので import 不要です
// HashMap のイテレーション順序は挿入順・アルファベット順等では保証されません
for (String name : gradeMap.keySet()) {
System.out.println(name + " : " + gradeMap.get(name));
}
}
}
HashMap はイテレーション順序を保証しないため、実行環境・JVMバージョンによって出力順が異なる場合があります。順序を保持したい場合は LinkedHashMap、ソートしたい場合は TreeMap を使います。
javac ImportBasic.java java ImportBasic === 呪術師一覧 === 虎杖悠仁 伏黒恵 釘崎野薔薇 五条悟 === 等級確認 === 七海建人 : 1級 乙骨憂太 : 特級 虎杖悠仁 : 1級 五条悟 : 特級
(等級確認の表示順は実行環境によって異なる場合があります)
StaticImportDemo.java
// staticインポートの使い方を示します
// Math クラスの定数・メソッドをクラス名なしで呼び出します
import static java.lang.Math.PI; // 定数 PI を直接使えるようにします
import static java.lang.Math.sqrt; // メソッド sqrt を直接使えるようにします
import static java.lang.Math.abs; // メソッド abs を直接使えるようにします
import static java.lang.Math.pow; // メソッド pow を直接使えるようにします
public class StaticImportDemo {
public static void main(String[] args) {
// --- staticインポートなしの場合 ---
// double area1 = Math.PI * Math.pow(5.0, 2);
// System.out.println("Math.PI使用: " + area1);
// --- staticインポートありの場合 ---
// 「Math.」を省略してそのまま書けます
double radius = 5.0;
double area = PI * pow(radius, 2); // Math.PI * Math.pow(...) と同等です
System.out.println("円(半径" + radius + ")の面積: " + area);
// sqrt と abs も「Math.」なしで使えます
double powerDiff = abs(9000.0 - 15000.0); // 2つの呪力値の差
double rmsValue = sqrt(pow(powerDiff, 2));
System.out.println("呪力差: " + powerDiff);
System.out.println("二乗平均平方根: " + rmsValue);
}
}
javac StaticImportDemo.java java StaticImportDemo 円(半径5.0)の面積: 78.53981633974483 戦闘力差: 6000.0 二乗平均平方根: 6000.0
WildcardConflict.java
// ワイルドカードインポートで名前衝突が起きるケースを示します
// java.util と java.sql には同名の「Date」クラスが存在します
import java.util.*; // java.util.Date を含む
import java.sql.*; // java.sql.Date を含む
// この状態で Date とだけ書くとコンパイルエラーになります
// error: reference to Date is ambiguous
public class WildcardConflict {
public static void main(String[] args) {
// 衝突を解消するには、使いたいクラスを完全修飾名(FQCN)で書きます
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date: " + utilDate);
// または、どちらか一方を個別インポートすることで曖昧さをなくせます
// import java.util.Date; と書けば Date は java.util.Date として扱われます
System.out.println("完全修飾名で衝突を回避できました。");
}
}
javac WildcardConflict.java java WildcardConflict java.util.Date: Wed Apr 08 12:34:56 JST 2026 完全修飾名で衝突を回避できました。
IDEでのインポート管理
| 操作 | IntelliJ IDEA | Eclipse | VS Code(Java拡張) |
|---|---|---|---|
| 未解決クラスを自動インポート | Alt + Enter | Ctrl + Shift + M | クイックフィックス(電球アイコン) |
| 未使用インポートの整理 | Ctrl + Alt + O | Ctrl + Shift + O | Shift + Alt + O |
| 保存時に自動整理 | 設定でオン可(Optimize imports on the fly) | 設定でオン可 | 設定でオン可 |
実際の開発ではIDEが import を自動的に追加・削除してくれるため、手動で書くことはほとんどありません。ただし「なぜ import が必要なのか」「どのパッケージから来ているのか」を理解しておくと、クラス名が衝突したときや別の環境でコードを動かすときに困りません。
よくあるミス1: import を書き忘れてコンパイルエラー
java.lang 以外のパッケージのクラスは import を書かないとコンパイルエラーになります。エラーメッセージに「cannot find symbol」が含まれる場合、import 漏れの可能性があります。
ImportMissingNg.java
public class ImportMissingNg {
public static void main(String[] args) {
// import java.util.ArrayList; が抜けています
ArrayList<String> names = new ArrayList<>();
names.add("五条悟");
System.out.println(names);
}
}
javac ImportMissingNg.java
ImportMissingNg.java:3: error: cannot find symbol
ArrayList<String> names = new ArrayList<>();
^
symbol: class ArrayList
location: class ImportMissingNg
2 errors
必要な import 文を追加するとコンパイルが通ります。IDEを使っている場合は、クラス名の上にカーソルを置くと自動インポートのサジェストが表示されます。
ImportMissingOk.java
import java.util.ArrayList; // import を追加します
public class ImportMissingOk {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("五条悟");
System.out.println(names);
}
}
javac ImportMissingOk.java java ImportMissingOk [五条悟]
よくあるミス2: ワイルドカードによる名前衝突
異なるパッケージに同名のクラスがある場合、両方をワイルドカードインポートするとコンパイラがどちらのクラスか判断できずエラーになります。典型例は java.util.Date と java.sql.Date の衝突です。
WildcardAmbiguousNg.java
import java.util.*; // java.util.Date を含む
import java.sql.*; // java.sql.Date を含む
public class WildcardAmbiguousNg {
public static void main(String[] args) {
// どちらの Date か曖昧なためコンパイルエラーになります
Date today = new Date();
System.out.println(today);
}
}
javac WildcardAmbiguousNg.java
WildcardAmbiguousNg.java:7: error: reference to Date is ambiguous
Date today = new Date();
^
both class java.util.Date in java.util and class java.sql.Date in java.sql match
1 error
使いたい方のクラスを完全修飾名(パッケージ名.クラス名)で書くか、どちらか一方を個別インポートして曖昧さを解消します。
WildcardAmbiguousOk.java
import java.util.*;
import java.sql.*;
import java.util.Date; // 個別インポートが優先されるため java.util.Date として扱われます
public class WildcardAmbiguousOk {
public static void main(String[] args) {
Date utilDate = new Date(); // java.util.Date として解決されます
System.out.println("java.util.Date: " + utilDate);
// java.sql.Date を使いたい場合は完全修飾名で書きます
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("java.sql.Date: " + sqlDate);
}
}
javac WildcardAmbiguousOk.java java WildcardAmbiguousOk java.util.Date: Wed Apr 08 12:34:56 JST 2026 java.sql.Date: 2026-04-08
概要
import 文はソースファイルの先頭(package 宣言の直後)に書きます。個別インポート(import java.util.ArrayList;)はクラスを1つずつ指定する書き方で、コードを読んだときに「どのクラスを使っているか」が明確になります。ワイルドカードインポート(import java.util.*;)はパッケージ直下の全クラスをまとめて対象にしますが、サブパッケージには適用されません。たとえば java.util.* を書いても java.util.concurrent.CopyOnWriteArrayList は別途 import が必要です。
import 文はコンパイラに「このクラス名がどのパッケージにあるか」を伝えるためのものです。実行時のクラスロードとは無関係であり、ワイルドカードを使っても使用していないクラスのバイトコードが増えることはありません。コンパイル後のクラスファイルのサイズや実行速度に影響しません。
import static は Math.PI や Math.sqrt() のような static 定数・メソッドを、クラス名なしで書けるようにします。数式が多いコードでは読みやすくなりますが、どのクラスのメンバーかが分かりにくくなる場合もあるため、多用するかどうかはプロジェクトの方針によります。
java.lang パッケージだけはコンパイラが自動的にインポートするため import は不要です。String・System・Math・Integer・Object などがこれに該当します。static メンバーの詳細については『main / static』を、パッケージ宣言とクラス設計については『class / new / コンストラクタ / this』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。