<<前ページ|目次|次ページ>> | ||||||||||||||||||||||||||||||||||||||||||||||||||
〜パッケージ〜 | ||||||||||||||||||||||||||||||||||||||||||||||||||
これまでJavaのプログラムを10cmの近さから虫眼鏡で見てきましたが、今度はぐっと離れて、1km先から双眼鏡で覗いてみましょう。 あなたの机の中は整理整頓できていますか?この引き出しはきれいにファイリングした書類、ここは文房具、ここは説明書、などきちんと分類整理できていたらどんなにいいでしょう。 Javaのクラスも、ただゴロゴロあっただけでは収拾がつきません。そこでクラスをしまっておくパッケージというものがあります。 パッケージp1にはクラスAとBとCがあります。クラスBでAを利用する場合のように、同じパッケージ内であれば、単に「A」とクラスの名前だけで使えます。ところが別のパッケージから使用したい場合、「p1.A」のように、クラス名の前にパッケージ名とピリオドをつけてやらなければなりません。 私が住んでいる集落は、有賀さんがとても多く、次が名取さんです。今井さんも結構います。(お年よりは屋号で呼んだりします。)パッケージを村、クラスを家とすると、この村には同じ苗字の家はあってはならないのです。つまり、パッケージには同じ名前のクラスが二つ以上あることが許されません。パッケージp1のクラスAといえば、たったひとつのクラスが特定できなければなりません。 Javaが提供するたくさんのクラスもパッケージで分類されています。文字列のクラスStringはパッケージjava.langに含まれます。他にもたくさんのパッケージが提供されています。 クラスをどのパッケージに入れたいかは、そのクラスの定義の先頭で、package文で指定します。もし何も指定しなかった場合は、どのパッケージにも属さないのかというと、そうではなく、無名パッケージに入ります。 クラスAをパッケージp1に入れるためには、その定義の頭に |
||||||||||||||||||||||||||||||||||||||||||||||||||
package p1; |
||||||||||||||||||||||||||||||||||||||||||||||||||
をつければよいのです。簡単でしょ。気をつけるのは必ず一番先頭に指定すること。 (ただしコメントは関係ありません。) 同じパッケージp1内のクラスBでクラスAのオブジェクトを作るには |
||||||||||||||||||||||||||||||||||||||||||||||||||
A obj; obj = new A(); |
||||||||||||||||||||||||||||||||||||||||||||||||||
とすればよいし、別のパッケージp2内のクラスDでは,フルネーム「p1.A」で |
||||||||||||||||||||||||||||||||||||||||||||||||||
p1.A obj; obj = new p1.A(); |
||||||||||||||||||||||||||||||||||||||||||||||||||
とすればよいのです。村中では「Aさんやーい」と呼べばよいのですが、よそ村からは「p1村のAさんやーい」と、村の名をつけて呼ばなければならないのです。 おっと!!ここで注意しなければならないことがあります。よそ村のDさんが「p1村のAさんやーい」と呼んでも、Aさんに返事してもらえないどころか、怒られてしまうことがあるのです。つまりクラスBはいいのですが、クラスDについては、上のやり方をすると「クラスAは使えません!」と怒られてしまうことがあるのです。それにはクラスAの定義を次のようにします。 引っ込み思案のクラスAの定義 |
||||||||||||||||||||||||||||||||||||||||||||||||||
package p1; class A { : } |
||||||||||||||||||||||||||||||||||||||||||||||||||
classの前にはなにも付けません。Aは「よそ村から声をかけられても知らん顔」となります。下の図のように、別のパッケージからは使用できません。 ではクラスDからp1.Aを使えるようにするにはどうしたらいいのでしょうか。 社交派クラスAの定義 |
||||||||||||||||||||||||||||||||||||||||||||||||||
package p1; public class A { : } |
||||||||||||||||||||||||||||||||||||||||||||||||||
そうclassの前にpublicを付ければよいのです。これでAは「よそ村の人に声かけられればすぐに答える。」となります。下のように、Aはどこからでも、つまり、どのパッケージのどのクラスからでも使用できます。 クラスDがpublicなクラスAを使うとき、一々パッケージ名p1を頭につけてp1.Aとしなければならないのは面倒です。こんなときクラスDに import p1.A; を追加すると、D中に現れるAはパッケージp1内のAを意味することになり便利です。 クラスDはこんなかんじ。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
package p2; import p1.A; public class D { : } |
||||||||||||||||||||||||||||||||||||||||||||||||||
この中で | ||||||||||||||||||||||||||||||||||||||||||||||||||
A obj; obj = new A(); |
||||||||||||||||||||||||||||||||||||||||||||||||||
とするとクラスAは、p1内のクラスAになります。 実はパッケージの効能に、クラスの名前の衝突を気にしなくてよい、というのがあります。もちろん同じパッケージ内では同じ名前のクラスがあってはなりませんが、別のパッケージであれば関係ありません。もしパッケージp2にクラスAがあった場合、Dからは同一パッケージ内なので単にAで使用可です。パッケージp1のクラスAは、先ほどやったようにp1.Aですね。下の図のようになります。 もしこれを単にAと呼んで使いたいときは、クラスDに import p1.A; を入れればよいです。 つまり、うちのp2村にもAさんがいるけど、これからいう「Aさん」はp1村のAさんだからね、と宣言しておくわけです。 importに関してもうひとつ。クラスDでパッケージp1内のすべてのクラスを、面倒なp1.を付けずに使いたい、という場合です。このときはDで、 import p1.*; としてください。こんなかんじ。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
package p2; import p1.*; public class D { : : } |
||||||||||||||||||||||||||||||||||||||||||||||||||
importに関してさらにもうひとつ。Javaの標準ライブラリには、先ほど挙げたようにjava.langやjava.utilなどのたくさんのパッケージがあります。この中でもjava.langというパッケージには、基本中の基本となるクラスが含まれているので例外的に、一々 import java.lang.*; を指定する必要はないことになっています。 パッケージp2から、パッケージp1のクラスをいくつか使う場合、あなたのお好みはどちらでしょう? タイプ1 タイプ2 |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
タイプ2は、使用するクラスをすべてimport文で明記しています。これは読むときにはありがたい、プログラム中突如出てきたクラスがどのパッケージに属するかがすぐわかるからです。でもプログラムを作るときは一々指定するのは面倒くさい、第一修正も多くなりそうだし、いやだな、という方は、タイプ1をどうぞ。どちらでもお好みの方をお使いください。 さてパッケージ名ですが適当に決めたら名前の衝突が起こりそうです。そこでSunは、ドメイン名をさかさまにしたパッケージ名を使うことを勧めています。たとえばドメイン名がxxx.comであれば、com.xxxがパッケージ名になるわけです。ただしこれひとつでは都合が悪いので、この下にサブパッケージという形で、com.xxx.businessやcom.xxx.formなどを作るわけです。その下にまた作ってもかまいません。 通常ひとつのクラスはひとつのファイルに対応します。クラスをしまっておくためのパッケージは、ディレクトリに対応します。つまりパッケージ名のピリオドで区切られた部分は、それぞれディレクトリに対応します。comの下のxxxの下のbusinessの下にビジネス関連のクラスを作成し、comの下のxxxの下のformの下に画面関連のクラスを作成するというようにすれば、きれいに整理できます。 ディレクトリには階層関係がありますが、パッケージ名にはないので注意しましょう。パッケージcom.xxxとパッケージcom.xxx.businessは別物です。それぞれに属するクラスには何の関係もありません。またこれに関連して import java.awt.*; とした場合、パッケージjava.awt内のクラスは対象となりますが、たとえばパッケージjava.awt.event内のクラスは対象とならないので注意してください。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
<<前ページ|目次|次ページ>> | ||||||||||||||||||||||||||||||||||||||||||||||||||
Copyright (c) 2004 Nagi Imai All Rights Reserved.. | ||||||||||||||||||||||||||||||||||||||||||||||||||