第7章 ファイル分割について
7.4 インポートについて
この節ではインポートについて学習していきます。実はこの機能はこれまでの学習範囲で既に利用しています。
Java入門テキストにてキーボード入力を行う為「Scanner」クラスを利用するのに、「import java.util.Scanner;」と指定したことを覚えていると思います。
ScannerクラスはJavaが用意している標準クラスですが、自身で作成したユーザー定義クラスであっても同じように「import文」を利用して、簡単に他のパッケージのクラスを利用することができるようになります。
その仕組みについて次の項より詳しく説明していきます。
7.4.1 インポートの仕組みを知る
前節では、異なるパッケージのクラスを利用するために、クラス名にパッケージ名をつけて記述することを学習しました。しかし、異なるパッケージのクラスを複数利用したいときに、いちいち全てのクラスにパッケージ名をつけるの大変手間がかかる作業です。そこで、「import」を利用するとこのような手間のかかる作業を省略することができます。
インポートについてimportとは、特定のパッケージに含まれるクラスをインポート(引き込む)する際に使用されるJavaのキーワードの1つです。importを利用すると、特定のパッケージ内のクラスを完全限定名で指定しなくても呼び出すことができるようになります。
書式:import文の定義
凡例:別パッケージクラスの指定(import文使用)
それでは次の項でimport文を利用したサンプルを紹介します。
7.4.2 importを利用し別パッケージのクラスを利用するプログラム
異なるパッケージ内にあるクラスを、別パッケージのクラスからimportして正しく動作することを確認します。
ソースコード
「UsingImport.java」ファイルを「jp.co.f1.basic.ch07_3」というパッケージに含め作成します。
importを利用してクラスを利用するだけで、内容はDifferentPackage1.javaと同じです。
呼び出すクラスは7.3.3項で作成したComputer3を利用しています。
Eclipse上でのファイル構成 解説
まず4行目で異なるパッケージのComputer3クラスのインポートを行っています。
import jp.co.f1.basic.ch07_2.Computer3;
4行目のインポートによりパッケージ名指定でクラスを利用していた記述が、11行目のようにパッケージ名の指定が無くても異なるパッケージのクラスを利用することができます。コンパイルエラーが出ていないことからも分かるように、前項では完全限定名を指定せずにクラスを利用しようとしていた為エラーになっていた記述が、インポートを利用することでその問題を解消できたことが確認できます。
public static void main(String[] args) { //完全限定名なしでクラスをオブジェクト化 Computer3 com = new Computer3(); com.setOsMemory("WindowsXP", 1024); com.show(); }
ポイント
- 別パッケージのクラスを使う場合は、import文を利用して行うと完全限定名を指定しなくてもクラスを利用できるので大変便利になる。
7.4.3 サブパッケージの仕組みについて
パッケージにはサブパッケージ(subpackage)という仕組みが存在します。それはパッケージに階層を作ると言うことです。パッケージに階層を作ることで、たくさんのクラスを機能別に分類することががきます。
7.2節でサブパッケージに少し触れていましたが、この機能は既に使用しています。この項では改めてサブパッケージにクラスを含める方法を紹介していきます。
図 7.4.1: パッケージ階層
それでは以下にサブパッケージの基本構文を示します。
書式:サブパッケージ指定
パッケージ名の後に「.」で区切りその後にサブパッケージ名を記述します。
凡例:サブパッケージ指定
パッケージの中にサブパッケージを作成することができますが、さらにサブパッケージの中にもサブパッケージを指定できます。これまで学習してきたサンプルで目にしてきたパッケージ指定方法がまさにこの方法になります。
ポイント
- パッケージにサブパッケージを作ることで、階層化を行うことができる。
7.4.4 標準クラスライブラリのパッケージについて
Javaにはユーザーが自身で作成したクラス以外にも、標準で用意されているクラスライブラリが存在します。そのクラスライブラリも、パッケージで分類されたクラスとなっています。クラスライブラリの主なパッケージは以下の表7.4.1のようになっています。
クラスライブラリのクラスを利用するには、パッケージ名を指定しなくてもいいように、通常はファイルの先頭でインポートを行います。例えば、次のように利用します。
凡例:クラスライブラリのインポート利用
標準クラスライブラリでもユーザー定義クラスでもインポート方法は同じになります。ただしjava.langパッケージだけは、インポートをしなくても自動的にインポートされるのでクラス名を記述するだけで利用が可能になっています。この理由から、このパッケージに含まれるStringクラスなどを使う場合には、インポートを行わなくてもそのままクラス名だけで利用できたのです。
7.4.5 複数のクラスをインポートする
同じパッケージ内の複数のクラスをインポートする場合には、次のようにクラス名をいちいち指定しなければなりません。
凡例:クラスライブラリの複数クラスのインポート利用
しかし、同じパッケージ内のクラスを多く使う場合に、この記述を毎回やるのはたいへん面倒な作業になります。
そこで、パッケージ内の複数のクラスを全てインポートするという記述ができます。この記述方法はインポートしたいパッケージを指定し、最後に「*」(アスタリスク)をつけることで行えます。
凡例:クラスパッケージ内の全クラスをインポート
上記のように指定したパッケージ内に含まれる全てのクラスがインポートされることになります。
但し、この指定では、サブパッケージのクラスまでは取り込んでくれません。サブパッケージのクラスもインポートしたい場合は、それぞれimport文を書かなければいけないので注意して下さい。
凡例:クラスパッケージ内の全クラスをインポートとサブパッケージの全クラスを取り込み
ポイント
- 同じパッケージ内のクラスを全てインポートしたい場合は「*」記号を使って行う。
- 但しサブパッケージ内のクラスは取り込んでくれないため、別途インポートを行う必要があります。
コラムインポートするとパッケージ名を省略してクラスを利用できますが、インポートした複数のパッケージに同名のクラスがあると、クラスを利用する際にどのパッケージのクラスなのか判断できない状態になります。
このような状況が発生した場合には、どちらか一方だけインポートし、もう片方は完全限定名で利用するなどの対応をとる必要があります。