他のパッケージに所属するクラスを利用するための予約語はimportです。これまで、Pointクラスを利用したときには、以下のようにファイルの先頭に import文を記述して、Javaに用意された Pointクラスを利用できるようにしていました。
import java.awt.Point;
これは「java.awtパッケージにある Pointクラスを利用する」という意味です。
また、swingを使用した S203プロジェクトでは以下のように複数の import文を使用しました。
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel;
これは、「java.awtパッケージにある ActionEventクラスと ActionListenerインターフェイスを利用する」ことと、「javax.swingパッケージにある BoxLayoutクラス、JButtonクラス、JFrameクラス、JLabelクラスを利用する」ことを表しています。
なお、特定のパッケージ内のすべてのクラス・インターフェイスなどを一括して利用可能にしたい場合には「*を使用することができます。例えば、先の例については以下の記述をしても構いません。
import java.awt.event.*; import javax.swing.*;
ただ、このように記述した場合は、思わぬクラス・インターフェイスなどを importしてしまう可能性があります。そのため、本ウェブサイトでは、一貫して「*」を使用しないことにします。
Systemクラスや Stringクラス、Mathクラスなどを利用する際には特段 import文を記述する必要はありませんでした。これは、Systemクラスや Stringクラス、Mathクラスがjava.langパッケージに所属しており、かつ、ソースコードの先頭に以下の記述が常に自動的に補完されるためです。
import java.lang.*;
これによって、Systemクラスや Stringクラス、Mathクラスなどの基本的なクラスを使用する際には、import文を記述しなくて良いということになります。また、例外クラスの多くも java.langパッケージに所属しているため、import文を記述しなくても使用できます。
先の章までに作成したすべてのクラスやインターフェイスは、特定のパッケージに所属していませんでした。どのパッケージにも所属していない場合は、デフォルトパッケージに所属しているという扱いになります。
後述しますが、Androidのプログラムを製作する場合は、必ずパッケージ名を指定しなければなりませんが、Javaのプログラムを製作する分には、パッケージ名を指定しないでも製作することができます。
大きなプログラムを製作する場合、クラスやインターフェイスなどの数が増大します。そうすると管理することが大変になります。パソコン内にたくさんのファイルがあった場合にディレクトリでグループ分けするように、Javaでは、パッケージを用いて、クラスやインターフェイスなどをグループ分けすることができます。
また、同一のパッケージに同一名称のクラス名やインターフェイス名は作れません。しかし、所属するパッケージが異なれば、同じ名前のクラスやインターフェイスを作成することができます。なお、異なるパッケージに所属する同じ名前のクラスやインターフェイスなどを同時に使用するためには、記述がややこしくなりますが、その詳細については本ウェブサイトでは省略します。
そのソースコードが、どのパッケージに所属するかを表すための予約語がpackageです。ソースコードの先頭に記述します。eclipse上でプログラムを製作する場合には、自動的に記述されますので、特段、意識することはないかと思います。
まず、プロジェクトを作成します(今回は T101プロジェクトを作成しました)。続いて、プロジェクト内の srcを右クリックして、「New」から「package」を選びます。
今回は「testa」パッケージを作成します。新しく表示されたウインドウに「testa」と入力します。
同様に「testb」パッケージを作成します。
この後、後述する T101のソースコードを入力すると以下のような表示になります。
デフォルトパッケージではなく、独自のパッケージを使用したプログラムを製作します。
ソースコードは以下の通り。
T101/testa/MyPoint.java
package testa; /** * 独自のポイント型クラスです。 */ public class MyPoint { /** * X座標。 */ public int x; /** * Y座標。 */ public int y; @Override public String toString() { return "MyPoint(" + this.x + "," + this.y + ")"; } }
T101/testb/T101.java
package testb; import testa.MyPoint; /** * MyPoint型をテストします。 */ public class T101 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { MyPoint myPoint = new MyPoint(); myPoint.x = 100; myPoint.y = 200; System.out.println("変数 myPointの参照先インスタンスの内容は " + myPoint); } }
実行結果の例は以下の通り。
変数 myPointの参照先インスタンスの内容は MyPoint(100,200)
import文を使用して、testaパッケージの MyPointクラスを利用できていることが分かります。
多くのクラスやインターフェイスなどを扱う大規模なプログラムを製作するような場合、もしクラスやインターフェイスの名前が重複した場合でも、異なったパッケージに所属させることができます。
自分が作成したクラスやインターフェイスを、他人に向けて公開する場合などに、偶然にも、自分の使っているパッケージ名と他人が使用しているパッケージ名が一致してしまう可能性があります。
これを防ぐため、Javaでは、パッケージ名には、以下のような命名をすべし、と提言されています。
こうすれば、他人のパッケージ名と重複することを防ぐことができます。ただし、自分が何らかのドメインを持っていることが必要なのと、あと、このルールは道徳的なルールであって強制ではないことに留意してください。
Androidプログラムでは、パッケージ名を必ず指定しなければなりません。また、このパッケージ名が、プログラムを Android端末にインストールする際のディレクトリに関係してきますし、google playに登録した場合には、そのアプリの URLにも関係してきます。
そのため、適当なパッケージ名ではいろいろな問題が発生します。他人と一致しないようなパッケージ名を設定してください。
本来であれば、本ウェブサイトで提供しているライブラリ MySystem, MyCanvas, AsyncPointは、それぞれ適当な名前のパッケージに所属させるのがベストです。こういう場合のために、パッケージという機構が存在するのですから。
しかし、そうするとパッケージについての説明をその前にしなければなりません。そのため、これらのライブラリはデフォルトパッケージでの提供という形としました。