検索

キーワード


【Java】importの宣言方法や役割、static import との違いを解説!

  • 公開日:2020-08-07 09:31:22
  • 最終更新日:2021-01-25 18:23:06
【Java】importの宣言方法や役割、static import との違いを解説!

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めて import について紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:パッケージの紹介 / Mathクラスの紹介 / クラスの紹介 / メソッドの紹介 / 演算の紹介 / static修飾子の紹介

importの役割と宣言方法、注意する点

1つのプロジェクト開発の中で、多くのクラスやインターフェースを作成することになりますが、

それらは機能ごとにパッケージでまとめられて、アクセスの管理がされています。

ここでは他(外部)のパッケージに保持されているクラス・インターフェースの中で、

アクセスが許可されているクラスやインターフェースを import する方法について紹介させていただきます。

 ※import はパッケージの機能と深く関わりがあるためパッケージがわからない方は、

  関連記事よりパッケージの紹介をご一読いただくことをおすすめします。


import の役割

クラスを作成すると通常は、同じパッケージ内のクラスへアクセスすることができますが、

その他の外部パッケージにあるクラスやインターフェースへはアクセスできません。

このような外部パッケージのクラスやインターフェースへアクセス可能にするためには、

その度「xxxパッケージの Oooクラスにあるこのメソッド!」といったように正確に指定しなければなりません。


◆ java の lang の中の Mathクラス にある定数 PI を使う場合

// 2 x 2 x PI(円周率) を出力
System.out.println(2*2*java.lang.Math.PI); // 結果:12.5663...


何度も同じクラスやメソッドを使う場合、

上記のように「java.lang.Math.PI」と呼ぶ方法ではプログラミングに対してかなりの負担となってきます。

このような負担を1回の記述のみへ軽減するために import 機能が存在します。



import の種類と宣言

import の方法には、クラスやインターフェースへアクセスするタイプと、

static 領域のメソッドや変数へアクセスするタイプの2種類が存在します。

import の宣言方法と2種類の import の違いについて見ていきましょう。


◆ import は「package」宣言直下で import 宣言を行います。

 import 宣言位置は2種類とも同じです。

package com.xxx.Ooo;

import com.xxx.Test; // ここで import 宣言

public class Sample{
}


import の宣言方法

import の宣言方法はそれぞれ「import」「import static」と宣言します。

また宣言に続くアクセスするクラスの指定は、全ての階層を記述して明確に指定します。

このような「明確な名前」のことを「完全修飾名」と呼びます。


     import     :クラスやインターフェースへアクセスして、インスタンス生成やメソッドの利用を可能にします。

         import 宣言はクラスまで指定をします。

// com の中の xxx パッケージにある Test クラスへアクセス
import com.xxx.Test;


import static:static 領域のメソッドや変数へアクセスして、メソッドや変数の利用を可能にします。

         import static 宣言はメソッドまで指定します。

// com の中の xxx パッケージにある Ooo クラスの static な method メソッドへアクセス
import static com.xxx.Ooo.method;

※static については別記事にて紹介させていただきますが簡単に紹介すると、

 static 宣言された変数やメソッドは、クラスのインスタンス化なしでアクセスが可能となります。



以上を参考に「import しない場合」「import した場合」「import static した場合」のメソッドの利用を比較してみましょう。

冒頭で例に出した Mathクラスを使って比較してみます。

System.out.println(2*2*java.lang.Math.PI); // import しない場合
System.out.println(2*2*Math.PI); // import した場合
System.out.println(2*2*PI); // import static した場合

かなり簡略化できましたね。



また import は「パッケージに含まれるすべてのクラス」や「クラスにある全てのメソッド」といった指定を

「アスタリスク( * )」を使うことで指定することが可能です。

// com の中の xxx パッケージにある全てのクラスへアクセス
import com.xxx.*;

// com の中の xxx パッケージにある Test クラスの全ての static なメソッドへアクセス
import static com.xxx.Test.*;

このように全てを import することを「オンデマンドインポート」と呼びます。


上記のようにクラスで1度 import 宣言をしておけば、以降は完全修飾名の記述を気にすることなく、

インスタンスの生成やメソッドの呼び出しができるようになります。


import する際に気を付けること

パッケージの仕組み上、クラス名またはインターフェース名が重複することも考えられます。

重複した名前のクラスなどを両方 import すると、どちらを使うのかが判断できずコンパイルエラーとなります。

// com の中の xxxパッケージにある Oooクラス
import com.xxx.Ooo;
// com の中の testパッケージにある Oooクラス
import com.test.Ooo;

//クラス名が同名のためインスタンス生成などができない


またアクセス修飾子が public 以外のメソッドや変数は、

import を宣言してもアクセス制御のルールに基づいてアクセスが拒否される可能性もあるため注意しましょう。

◆ sampleパッケージの Sampleクラスに「public の method1」と「private の method2」メソッドを作成

package sample;

public class Sample {

	public String method1(String test1) {
		return test1;
	}

	private String method2(String test2) {
		return test2;
	}
}

◆ testパッケージの Testクラスを作成、上記 Sampleクラスを import、インスタンス生成して method1 と method2 を呼ぶ

package test;

import sample.Sample;

public class Test{

	public static void main(String[] arg) {
		Sample sample = new Sample();
		sample.method1("a"); // public のためアクセス可能
		sample.method2("a"); // private のためコンパイルエラー
	}
}

method2 はアクセス修飾子が pritvate のためコンパイルエラーとなります。


また、import 宣言なしで利用できるパッケージも存在します。

Java でプログラミングを行う際に必ず使う String などを含んだ「java.lang」パッケージは、

頻繁に利用されるためあらかじめ import されており宣言の必要がありません。


※import について理解しやすいため今回は「Math」を import の例としましたが、

 「Math」も「java.lang」に属するため実は「Math.PI」のように宣言なしで使うことができます。



まとめ

Java のパッケージにはデータやファイルの入出力を主要な機能とした「java.io」パッケージや

コレクションや日時機能を主要とした「java.util」といったパッケージをはじめ、

たくさんの便利なパッケージが用意されています。

必要に応じて import を活用していきましょう。


関連記事リンク

パッケージの紹介 / Mathクラスの紹介  / クラスの紹介 / メソッドの紹介 / 演算の紹介 / static修飾子の紹介


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様