Javaとオブジェクト指向 インポート(4-14)

記事上広告

インポートとは

Javaではパッケージ化されたクラスを利用するためには、クラス名にパッケージ名を追加した完全限定名で利用する必要があります。

インポートはパッケージ化されたプログラムを利用するうえで便利な機能です。

インポートの理解を深めるために、以下のサンプルプログラムを記述してみましょう。

インポート サンプルプログラム

workフォルダ内のgameフォルダに「character」フォルダと「material」フォルダを作成してください。

以下のプログラムをcharacterフォルダ内とmaterialフォルダに「Test.java」workフォルダには「Number38.java」という名前で保存します。(以下、階層構造図)

保存が完了したら、コマンドプロンプトを起動し、Number38.javaをコンパイルおよび実行をしてみましょう。

実行例

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をコンパイルおよび実行してみましょう。

今回は実行例が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

C:\work>javac Number38.javaC:\work>java Number38
gameパッケージのTestクラス
gameパッケージのTestクラス

※実行例はコンパイル及び実行時の例を表示しています。

サンプルプログラムの解説

上記の実行例ではエラーとなっています。ですが、場合によってはエラーが起こらないこともあります。原因は複数のパッケージに同じクラスが存在することによって起こります。

上記のエラーはNumber38.javaと同一パッケージ(workフォルダ)にTestクラスが作成されている場合に表示されるエラーです。

複数のパッケージでクラス名が重複する場合には完全限定名を利用しましょう。

エラーが起こらない場合は、import文でgameパッケージのTestがインポートされます。

*にはサブパッケージは含まれないので、game. characterとgame.materialのパッケージをインポートしたつもりでもgameパッケージのみのインポートとなりますので注意してください。

補足

ソース内にpackage宣言とimport文が両方含まれる場合はpackage、importの順で記述する必要があります。(以下の記述順)

  1. package宣言
  2. import文

順番を逆にするとコンパイルエラーとなりますので注意してください。

インポート 復習問題

import文として正しいものを選んでください。
解答群
import pack;
import pack.subpack;
import pack.subpack.*;
import pack Test*
インポートの説明として正しいものを選んでください。
解答群
インポートするとインスタンス生成が不必要となる
インポートするとパッケージ宣言が不必要となる
インポートすると型を省略できる
インポートするとパッケージが省略できる
インポートの説明として正しいものを選んでください。
解答群
*を利用するとサブパッケージもインポートできる
*を利用すると複数のパッケージを同時にインポートできる
package->importの順で記述する
import->packageの順で記述する
お疲れ様でした。

まとめ

  • インポートを利用するとパッケージ名を省略できる
  • *を使うとパッケージ内のクラスを全て一括インポートできる
  • *はサブパッケージは含まれない
  • 複数のパッケージでクラス名が重複する際には完全限定名を利用する
  • package宣言が先、import文は後
スポンサーリンク
レクタングル