もくじ
インポートとは
Javaではパッケージ化されたクラスを利用するためには、クラス名にパッケージ名を追加した完全限定名で利用する必要があります。
インポートはパッケージ化されたプログラムを利用するうえで便利な機能です。
インポートの理解を深めるために、以下のサンプルプログラムを記述してみましょう。
インポート サンプルプログラム
workフォルダ内のgameフォルダに「character」フォルダと「material」フォルダを作成してください。
以下のプログラムをcharacterフォルダ内とmaterialフォルダに「Test.java」workフォルダには「Number38.java」という名前で保存します。(以下、階層構造図)
保存が完了したら、コマンドプロンプトを起動し、Number38.javaをコンパイルおよび実行をしてみましょう。
1 2 3 4 5 6 7 8 |
//game.materialパッケージ package game.material; public class Test{ public void exe(){ System.out.println("game.materialパッケージのTestクラス"); } } |
1 2 3 4 5 6 7 8 |
//game.characterパッケージ package game.character; public class Test{ public void exe(){ System.out.println("game.characterパッケージのTestクラス"); } } |
1 2 3 4 5 6 7 8 9 10 11 |
class Number38{ public static void main(String[] args){ //game.materialパッケージ内のTestクラスを利用する game.material.Test test01 = new game.material.Test(); test01.exe(); //game.characterパッケージ内のTestクラスを利用する game.character.Test test02 = new game.character.Test(); test02.exe(); } } |
実行例
C:\work>javac Number38.java
C:\work>java Number38
game.materialパッケージのTestクラス
game.characterパッケージのTestクラス
※実行例はコンパイルおよび実行の例を表示しています。
インポートの役割と特徴
サンプルプログラムのNumber38.javaはパッケージ化されたクラスを利用しています。
完全限定名を利用していますが、インスタンス生成を行うたびにパッケージ名まで書かなくてはならず、記述が長くなってしまいます。
そこで、インポートを利用します。インポートを記述するとインスタンス生成する際にパッケージ名を省略できるため、記述量が減るだけでなく可読性も向上します。
インポートはimportの右にパッケージ名を省略したいクラス(完全限定名)を記載します。
importの記述 | import パッケージ名.クラス名 ;
アクセス修飾子 class クラス名{
|
---|---|
記述例 | import game.Test ; import game.material.Test ; public class Test{
|
インポートには同一パッケージ内で利用したいクラスが複数ある場合は、クラス名の代わりに「*」(アスタリスク)を利用することで、まとめることもできます。
importの記述 | import パッケージ名.* ;
アクセス修飾子 class クラス名{
|
---|---|
記述例 | import game.* ; import game.material.* ; public class Test{
|
例えば、gameパッケージ内に「Test.java」と「Print.java」がある場合、
import game.Test;
import game.Print;
と記述できますが、以下のように*を使うことでまとめることができます。
import game.*;
しかし、*を使う際には以下の点に気を付けましょう。
- *はサブパッケージは含まれないため、サブパッケージは別でインポートする必要がある
- *は便利だが、パッケージ内に大量のクラスファイルがあると、不要なクラスまで大量にインポートすることになる
インポート サンプルプログラム[修正]
上で作成した「Number38.java」をインポートの記述に変更して保存します。
保存ができたら、Number38.javaをコンパイルおよび実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//gameパッケージ内のクラスをインポート import game.*; class Number38{ public static void main(String[] args){ //game.material.Test test01 = new game.material.Test(); Test test01 = new Test(); test01.exe(); //game.character.Test test02 = new game.character.Test(); Test test02 = new Test(); test02.exe(); } } |
今回は実行例が2パターン存在します。(理由は後述)
実行例1
C:\work>javac Number38.java
Number38.java:9: エラー: シンボルを見つけられません
test01.exe();
^
シンボル: メソッド exe()
場所: タイプTestの変数 test01
Number38.java:14: エラー: シンボルを見つけられません
test02.exe();
^
シンボル: メソッド exe()
場所: タイプTestの変数 test02
エラー2個
※実行例はコンパイルの例を表示しています。
実行例2
gameパッケージのTestクラス
gameパッケージのTestクラス
※実行例はコンパイル及び実行時の例を表示しています。
サンプルプログラムの解説
上記の実行例ではエラーとなっています。ですが、場合によってはエラーが起こらないこともあります。原因は複数のパッケージに同じクラスが存在することによって起こります。
上記のエラーはNumber38.javaと同一パッケージ(workフォルダ)にTestクラスが作成されている場合に表示されるエラーです。
複数のパッケージでクラス名が重複する場合には完全限定名を利用しましょう。
エラーが起こらない場合は、import文でgameパッケージのTestがインポートされます。
*にはサブパッケージは含まれないので、game. characterとgame.materialのパッケージをインポートしたつもりでもgameパッケージのみのインポートとなりますので注意してください。
補足
ソース内にpackage宣言とimport文が両方含まれる場合はpackage、importの順で記述する必要があります。(以下の記述順)
- package宣言
- import文
順番を逆にするとコンパイルエラーとなりますので注意してください。
インポート 復習問題
- import文として正しいものを選んでください。
- 解答群
import pack;
import pack.subpack;
import pack.subpack.*;
import pack Test*
- インポートの説明として正しいものを選んでください。
- 解答群
- インポートするとインスタンス生成が不必要となる
- インポートするとパッケージ宣言が不必要となる
- インポートすると型を省略できる
- インポートするとパッケージが省略できる
- インポートの説明として正しいものを選んでください。
- 解答群
- *を利用するとサブパッケージもインポートできる
- *を利用すると複数のパッケージを同時にインポートできる
- package->importの順で記述する
- import->packageの順で記述する
- お疲れ様でした。
まとめ
- インポートを利用するとパッケージ名を省略できる
- *を使うとパッケージ内のクラスを全て一括インポートできる
- *はサブパッケージは含まれない
- 複数のパッケージでクラス名が重複する際には完全限定名を利用する
- package宣言が先、import文は後