最初にこれらのオブジェクトを使用するSample60クラスを作成します。手順は以下のとおりです。
それでは、Sample60で、原点(0, 0)を表す点o(オー)オブジェクト、点(1, 2)と点(3, 6)を結ぶ線lineオブジェクトと、点(2, 3)と点(4, 9)と点(0, 6)から構成される三角形triangleオブジェクトと、点(10, 10)を中心として半径が1である円circleオブジェクトを表現してみましょう。
これらのオブジェクトを表現するためには、これまでに用意したクラスを使って変数を宣言します。
// 点oオブジェクト
Point o;
// 線lineオブジェクト
Line line;
// 三角形triangleオブジェクト
Triangle triangle;
// 円circleオブジェクト
Circle circle;
Javaでは、変数を宣言しただけではオブジェクトの情報を保持するための入れ物は用意されません。配列のときと同じように「new演算子」を使って、この入れ物を作成します。こうやって作成された入れ物のことを、「インスタンス(instance、事実、実例)」といいます。インスタンスは、プログラムにおいてオブジェクトの情報を格納するために作成されるものと覚えておいてください。
インスタンスを作成するためには、new演算子の後に「クラス名()」と書きます。また、インスタンスが作成された後の評価結果は、インスタンスが用意された場所を示す値となります。この値を変数へ代入することにより、変数を使って入れ物を利用できるようになります。
o = new Point();
line = new Line();
triangle = new Triangle();
circle = new Circle();
インスタンスを作成するためにnew演算子の後に書いたものは、実は各クラスの「コンストラクタ(construtor、組立てる者)」というものです。
入れ物を作成するに当たっては、各フィールドの初期値を設定したいことも多いので、そういった処理ができるようにコンストラクタというものが用意されており、プログラマが自分でその処理をコーディングすることもできるようになっています。
本連載では、コンストラクタの詳細については解説しませんが、興味のある読者は調べてみてください。
さて、入れ物の作成ができて、変数を使って利用できるようになりました。ただし、まだ原点の情報や点(1, 2)の情報などはプログラムに入ってきていないので、これらの値を設定しなければいけません。フィールドへ値を設定するためには、次のようにします。もちろん変数名の後に指定できるフィールド名は変数の型となるクラスが持つフィールド名だけです。
変数名.フィールド名 = 値;
従って、変数oへ次のように値を設定することで、oは原点を表現することになります。
o.x = 0;
o.y = 0;
次に、lineやtriangleのフィールドを設定しますが、注意しなければならないことがあります。lineやtriangleではPoint型のフィールドは宣言されていますが、これらの入れ物が用意されていないということです。そこで、これらの変数のフィールドへ設定するPoint型のインスタンスを使うために変数を用意します。
Point point = new Point();
point.x = 2;
point.y = 3;
line.p0 = point;
point = new Point();
point.x = 4;
point.y = 9;
line.p1 = point;
フィールドへ直接Point型のインスタンスを代入してからx座標とy座標を代入することもできます。
triangle.p0 = new Point();
triangle.p0.x = 3;
triangle.p0.y = 9;
triangle.p1 = new Point();
triangle.p1.x = 4;
triangle.p1.y = 3;
triangle.p2 = new Point();
triangle.p2.x = 4;
triangle.p2.y = 6;
同様にしてcircleにも値を設定します。
circle.p0 = new Point();
circle.p0.x = 10;
circle.p0.y = 10;
circle.r = 1;
最後に例としてo.x、line.p0.y、line.p1.x、triangle.p2.y、circle.rの値を出力してみます。もしo.yやline.p0.xなどほかの値を出力してみたい場合は、同様にして System.out.printlnの命令を使って出力してみてください。
System.out.println(o.x);
System.out.println(line.p0.y);
System.out.println(line.p1.x);
System.out.println(triangle.p2.y);
System.out.println(circle.r);
各オブジェクトをプログラムで表現できた!
ここまでのコードをまとめると、次のようになります。これで各オブジェクトをプログラムで表現できたことになります。
public class Sample60 {
public static void main(String[] args) {
// 点oオブジェクト
Point o;
// 線lineオブジェクト
Line line;
// 三角形triangleオブジェクト
Triangle triangle;
// 円circleオブジェクト
Circle circle;
// インスタンス生成と各変数への代入
o = new Point();
line = new Line();
triangle = new Triangle();
circle = new Circle();
// 点oの初期化
o.x = 0;
o.y = 0;
// 線lineの初期化
Point point = new Point();
point.x = 2;
point.y = 3;
line.p0 = point;
point = new Point();
point.x = 4;
point.y = 9;
line.p1 = point;
// 三角形triangleの初期化
triangle.p0 = new Point();
triangle.p0.x = 3;
triangle.p0.y = 9;
triangle.p1 = new Point();
triangle.p1.x = 4;
triangle.p1.y = 3;
triangle.p2 = new Point();
triangle.p2.x = 4;
triangle.p2.y = 6;
// 円circleの初期化
circle.p0 = new Point();
circle.p0.x = 10;
circle.p0.y = 10;
circle.r = 1;
// 各オブジェクトの値を出力
System.out.println(o.x);
System.out.println(line.p0.y);
System.out.println(line.p1.x);
System.out.println(triangle.p2.y);
System.out.println(circle.r);
}
}
このプログラムを実行すると、o.x、line.p0.y、line.p1.x、triangle.p2.y、circle.rの値が出力されて以下のような結果が得られます。
Sample60.javaの実行結果
0 3 4 6 1
今回は、オブジェクトとクラスという用語、Javaのクラスとインスタンスについて解説をしました。また、クラスの属性を表現するためには、Javaではクラスにフィールドを用意するということを解説しました。
オブジェクト指向では、実際にある物からクラスを抽出すればよいので、直感的にプログラムを理解できたのではないでしょうか。今回の例だけでは、まだピンと来ないかもしれませんが、クラスを使うことにより、まとめて扱いたいデータ用に自分でデータ型を定義できるようになります。対象とするデータを保持するためには、対応するフィールドをクラスに用意するだけです。
このクラスやフィールドというものは重要な概念になりますので、よく覚えておくようにしてください。また、Javaではインスタンスを生成するためには、基本的にnew演算子を使う点も忘れないようにしましょう。
さて、クラスの宣言については、まだ重要な要素が抜けています。それは「クラスの振る舞い」についてです。Javaでは「メソッド」というものを使って、「クラスの振る舞い」を表現します。まとめて扱いたいデータに対してデータ型を定義できるだけでもクラスというのは便利ですが、メソッドという概念を理解すると、さらに便利になります。次回はこれらについて解説する予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
Copyright © ITmedia, Inc. All Rights Reserved.