CLASSPATHの前にまずimportの機能を理解しましょう
importの書き方には二通りあります。
- import java.util.Vector;
- import java.util.*;
1は single-type-import declaration
2は type-import-on-demand declaration
と呼びます。
いずれも、クラスのパッケージ解決のルール付けをコンパイラに対して行うのが目的です。
何やら難しい言葉になりましたが、要は、外部のクラスを見つける時のルールです。
importで大切なのは、コンパイル(javacコマンド)の時だけ使われる、
ということです。実行時(javaコマンド)には関係ありません。では、次の例を見て下さい。
- Vector v3 = new Vector();
と書いた場合それは、
- java.util.Vector v3 = new java.util.Vector();
の簡略化した書き方を意味します。(v3を見て仮面ライダーを想像した人は私と同世代です)
本当は2のように書かなければいけないんだけど、importで書いておけば
1のように省略してもいいよ、というルールになってます。
single-type-import declarationとtype-import-on-demand declarationの違いは、
一つのクラスだけを見つければいいのか、それともjava.utilというパッケージの中にある複数のクラスを見つけたいのか、
ということです。
パッケージの説明はあとで出てくるのでここでは単に、
「パッケージとは、たくさんのクラスを管理しやすくするためにディレクトリ構造を持つ仕掛け」
と覚えて下さい。
パッケージのimportに関して注意しなければならないのは、
import java.*;
と書いたからといって、javaパッケージ以下の全パッケージも参照出来るようになるわけではないことです。
あくまでもそのパッケージの直下にあるクラスのみを参照します。
java.util だけでなく java.util.jar パッケージのクラスも利用したい場合は、
import java.util.*;
import java.util.jar.*;
という2行を書く必要があります。
次の例を見てください。
import様のおかげでコンパイルが成功するクラス |
package ytp.test;
// これでVectorクラスが使えるようになります
import java.util.*;
/**
* importの効果を確認するクラス
* @author YTP
*/
public class TestImport {
public static void main(String[] args) {
TestImport test = new TestImport();
test.test(args);
}
public void test(String[] args) {
java.util.Vector v1 = new java.util.Vector();
Vector v2 = new Vector();
v1.add("Hello ");
v2.add("YTP!!");
System.out.println((String)v1.get(0) + (String)v2.get(0));
}
}
|
Vector v2 = のように書いた場合であってもimportがあるおかげで、
javacで出来上がったclassファイルの中には
java/util/Vectorという形でシンボルが記述されます。
classファイルのレントゲン写真 |
|
importを書いていないのにパッケージ名を省略したコーディングをすると、
コンパイラはVectorクラスを探し切れず、「シンボルを解釈処理出来ません」
とエラーを吐きます。(下記)
import様をないがしろにしたクラス |
package ytp.test;
// importをやめてしまうと.....
// import java.util.*;
/**
* importの効果を確認するクラス
* @author YTP
*/
public class TestImport2 {
public static void main(String[] args) {
TestImport2 test = new TestImport2();
test.test(args);
}
public void test(String[] args) {
java.util.Vector v1 = new java.util.Vector();
Vector v2 = new Vector(); // 省略してもへっちゃらか???
v1.add("Hello ");
v2.add("YTP!!");
System.out.println((String)v1.get(0) + (String)v2.get(0));
}
}
|
天罰が下った図 |
C:\Source\Java>javac ytp\test\TestImport2.java
ytp\test\TestImport2.java:18: シンボルを解釈処理できません。
シンボル: クラス Vector
位置 : ytp.test.TestImport2 の クラス
Vector v2 = new Vector(); // 省略してもへっちゃらか???
^
ytp\test\TestImport2.java:18: シンボルを解釈処理できません。
シンボル: クラス Vector
位置 : ytp.test.TestImport2 の クラス
Vector v2 = new Vector(); // 省略してもへっちゃらか???
^
エラー 2 個
C:\Source\Java>
|
続いてはpackageの使い方です。
|