既存クラスの利用

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

Rectangleクラス

四角い領域を表すのに、Javaでは次の図の様に4つのデータの組を使います。
左上隅の座標「x」、座標「y」、幅「width」、高さ「height」の4つです。
ドキュメントを用いて、Rectangleクラスを調べてみましょう。

パッケージとimport

ドキュメントを見ると、実に沢山のクラスが提供されている事が解ります。
余りにも多いので、関係するクラスを集めてフォルダにまとめてあります。
此をパッケージと言います。
プログラム中で既存のクラスを使う時は、其のクラスが何処のパッケージに有るのかを指定しなければなりません。
ドキュメントによると、Rectangleクラスは「java.awt」と言うパッケージに有る事が解ります。
パッケージ名は、クラス名を記述する時に毎回、

java.awt.Rectangle

の様に記述しても良いのですが、クラス名を記述する度に長いパッケージ名から書くのは大変なので、プログラムの最初に、プログラム内で使うクラス名をパッケージ付きで登録しておきます。

import パッケージ付きクラス名
例: import java.awt.Rectangle;

同じパッケージに入っているクラスが多数有る場合も有るので、クラス名に「*」を指定して「此のパッケージは全部のクラス」と言う書式も使えます。

例: import java.awt.*;

但し「*」は、其のパッケージに直接含まれるクラスしか包括しません。
其の為、下の様な階層のパッケージでは、

java.awt.Rectangle

と指定しても「event」に含まれるクラスは含まれず、別途指定が必要になります。

Rectangleクラスのオブジェクトの宣言とフィールド

ドキュメントによると、Rectangleクラスのフィールドは以下の4つである事が解ります。

Rectangleクラスのフィールドの一覧

フィールドの概要
int height Retangleの高さ
int width Rectangleの幅
int x Rectangleのx座標
int y Rectangleのy座標

Rectangleクラスを使ってデータを記憶する為には、Rectangleクラスのオブジェクト名を宣言しなければならない事は既に学習しました。
変数の宣言と同じでしたね。
此処では、オブジェクト名を「data」と言う名前にしましょう。

Rectangle data;

オブジェクトに含まれるフィールドの1つを指定するには、以下の形式で書きます。

オブジェクト名.フィールド名
例: data.x = 10;

コンストラクタとインスタンス化

オブジェクトは、宣言しただけではメモリ領域が確保されず、データを記憶出来ません。
初期化作業を行ってメモリ領域を確保するのが、コンストラクタと呼ばれるメソッドです。
コンストラクタはクラス名と完全に一致した名前を持ち、通常のメソッドと同様、仮引数にデータを受け取れますが、戻り値は有りません。
又、オーバーロードされている場合もあります。
Rectangleクラスでのコンストラクタは、どんな実引数を指定したら良いのかをドキュメントで調べてみましょう。

Rectangleクラスのコンストラクタの一覧

コンストラクタの概要
Rectangle() 左上隅が座標空間の(0, 0)に有り、幅と高さが両方とも0の新しいRectangleを構築
Rectangle(Dimension d) 左上隅が(0, 0)で、幅と高さがDimension引数で指定される新しいRectangleを構築
Rectangle(int width, int height) 左上隅が座標空間の(0, 0)に有り、幅と高さがwidth引数及びheight引数で指定される新しいRectangleを構築
Rectangle(int x, int y, int width, int height) 左上隅が(x, y)として指定され、幅と高さがwidth引数及びheight引数で指定される新しいRectangleを構築
Rectangle(Point p) 左上隅が指定されたPointで、幅と高さが両方とも0で有る新しいRectangleを構築
Rectangle(Point p, Dimension d) 左上隅がPoint引数で指定され、幅とサイズがDimension引数で指定される新しいRectangleを構築
Rectangle(Rectangle r) 指定されたRectangleの値に一致する様に初期化された新しいRectangleを構築

Rectangleクラスでは、7種類のコンストラクタが用意されています。
此等の仮引数に指定された値でフィールドが初期化されるので、此の中から最も都合が良い物を選んで使います。
此処では「x」「y」「width」「height」がそれぞれint型の数値で用意出来ます。
其の為、4番目の

Rectangle(int x, int y, int width, int height);

を使う事にしましょう。
コンストラクタの呼び出しは、通常のメソッドと少し異なり、以下の様に書きます。

オブジェクト名 = new コンストラクタ(実引数の並び)
例: data = new Rectangle(10, 55, 280, 90);

コンストラクタは、オブジェクトの領域を確保して各フィールドを初期化する働きが有ります。
此等一連の作業がインスタンス化なのです。

Rectangleクラスのメソッド

ドキュメントによると、Rectangleクラスには、沢山のメソッドが定義されています。
此等は全て、Rectangleクラスのオブジェクトを処理のターゲットとします。
代表的なメソッドを幾つか紹介しながら、メソッドとオブジェクトの関わりを学んで行きましょう。

主なメソッド

メソッドの概要
boolean contains(int x, int y) 此のRectangleが、指定された位置(x, y)に有る点を含むかどうかを指定
boolean equals(Object obj) 2つの矩形が同じかどうかを判定
double getHeight() 境界のRectangle領域の高さをdouble精度で返す
double getWidth() 境界のRectangle領域の幅をdouble精度で返す
double getX() 境界のRectangle領域のX座標をdouble精度で返す
double getY() 境界のRectangle領域のY座標をdouble精度で返す
void setLocation(int x, int y) 此のRectangleを指定された位置に移動
void setSize(int width, int height) 此のRectangleの大きさを指定された幅と高さに設定
void translate(int x, int y) x座標軸に沿って右方向へ、y座標軸に沿って下方向へ、指定された距離だけ此のRectangleを移動

containsメソッド

引数で指定した点が、ターゲットとなるオブジェクトが表す四角形の内側で有れば「true」が、外側で有れば「false」が戻り値として返ります。

例: Rectangle data = new Rectangle(75, 50, 250, 200);
Boolean flag = data.contains(80, 100);

equalsメソッド

ターゲットとなるオブジェクトのデータと、引数で指定されたオブジェクトのデータが等しければ「true」が、異なっていれば「false」が戻り値として返ります。

例: Rectangle data = new Rectangle(75, 50, 250, 200);
Rectangle cmp = new Rectangle(75, 50, 250, 200);
Boolean flag = data.equals(cmp);

オブジェクトの「data」をターゲットとして、「cmp」のデータがターゲットと等しいかどうかを調べます。
此の場合は4つのデータが全て等しいので、「true」が返ります。
此処で、

if(data == cmp)

とすると結果はどうなるのでしょうか?
此は、オブジェクトの中のデータ同士を比較するのではなく、データを入れるオブジェクト其の物を比較の対象としています。
つまり「data」と「cmp」が同じメモリ領域を見ている時のみ「true」となり、其れ以外は「false」です。

ゲッタメソッド(getX・getY・getWidth・getHeight)

それぞれのフィールドに設定されている値を取り出すメソッドです。
此の様なメソッドを総称して、ゲッタメソッドと言います。
フィールドに値を直接代入するのではなく、ゲッタメソッドを使う事で、フィールドがどの様な構成になっているのかに依存する事無く、データを得られます。

フィールドの値を書き換えたり値を呼び出したりする時、直接フィールドを指定するのではなく、クラスに所属するメソッドを使うやり方をデータの隠蔽と言います。

例: Rectangle data = new Rectangle(75, 50, 250, 200);
int x = data.getX();

セッタメソッド(setLocation・setSize・translate)

「setLocation」はターゲットとなるオブジェクトの「x」「y」フィールドに、「setSize」は「width」「height」フィールドにそれぞれデータを設定するメソッドです。
此の様なフィールドに値を設定するメソッドの総称をセッタメソッドと言います。
セッタメソッドを使う事で、不正なデータの設定を阻止出来ます。
translateメソッドは、「x」「y」フィールドの値を実引数で指定された値だけ加算します。

例: Rectangle data = new Rectangle(75, 50, 250, 200);
data.translate(10, 20);

乱数

randomメソッド クラスメソッドと呼ばれる、インスタンス化されたオブジェクトをターゲットとしないメソッド

50個描く小さな円の中心は、乱数で求めます。
円が画面からはみ出さない様に、中心のx座標は「0〜400」、y座標は「0〜300」の範囲で求める事にしましょう。
ランダムな数値、即ち「乱数」を求めるには、Mathクラスの「random()」メソッドを使います。
ドキュメントによると「0.0以上で、1.0より小さい正の符号が付いたdouble値を返します」と有ります。
一般に「random()」を使って「m〜n」迄の乱数を得たい時には、

(int)((n-m+1)*Math.random()+m);

で求められます。
x座標は0以上400より小さいint型の値が欲しいので、得られた数値を400倍してから、キャストを付けてint化します。

0.0  1.0未満
     ↓*400
0   400未満なので399
x =(int)(Math.random()*400);

此処での上記の様な下線部を囲む「()」は省略出来ません。
省略するとキャストの「int」は「Math.random()」をint型にする働きをして終います。
「Math.random()」は1未満の値しか取りませんので、全て「0」になって終い、「0」に「400」を掛けても求められる値は全て「0」になって終います。

ソース ダウンロード
MedamaC.java Medama05.zip MedamaC.html
InOutGui.java InOutGui.zip

戻る