言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Java辞典

  1. トップページ
  2. Java辞典
  3. import 文(Java)

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 パッケージは StringSystemMathInteger など Java の根幹をなすクラスが集まっています。このパッケージはコンパイラが自動的にインポートするため、import java.lang.*; と書く必要はありません。それ以外のパッケージ(java.utiljava.iojava.nio など)は明示的に import を書く必要があります。

クラス例パッケージimport の要否
Stringjava.lang不要(自動インポート)
Systemjava.lang不要(自動インポート)
Mathjava.lang不要(自動インポート)
ArrayListjava.util必要
HashMapjava.util必要
Filesjava.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 IDEAEclipseVS Code(Java拡張)
未解決クラスを自動インポートAlt + EnterCtrl + Shift + Mクイックフィックス(電球アイコン)
未使用インポートの整理Ctrl + Alt + OCtrl + Shift + OShift + 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.Datejava.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 staticMath.PIMath.sqrt() のような static 定数・メソッドを、クラス名なしで書けるようにします。数式が多いコードでは読みやすくなりますが、どのクラスのメンバーかが分かりにくくなる場合もあるため、多用するかどうかはプロジェクトの方針によります。

java.lang パッケージだけはコンパイラが自動的にインポートするため import は不要です。StringSystemMathIntegerObject などがこれに該当します。static メンバーの詳細については『main / static』を、パッケージ宣言とクラス設計については『class / new / コンストラクタ / this』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。