Table of Contents
今回は、今まで書いてきた全プログラム中に含まれていましたが、詳しく説明してこなかったクラスについて解説します。
クラスは Java の根幹を成す仕組みと言えます。
クラスとは
今まで書いてきたプログラムは、以下のように、「Test」という名前のクラスの中に書いていました。
public class Test { public static void main(String args[]) { System.out.println("Hello World!"); } }
(package文やimport文は例外的にクラスの外側に書きます)
そして、メソッドはクラスの中に含まれる機能であり、メソッドを使用するためにはクラスのインスタンス化が必要なことを前々回に紹介しました。
インスタンス化というのは、日本語で言えば「実体化」「具体化」などと訳すことができます。
クラスとは、ある機能・役割を持つプログラムの設計書のようなものです。これをインスタンス化(実体化)することによって、その機能を実際に使える形にすることができます。
これまで書いてきたプログラムは小規模なものでしたので、一つのメソッドで処理が完結していました。しかし、大規模なプログラムを作る場合、関連する処理などは一つの設計書にまとめて書いておく方が後々の作業を考えると必要になってきます。
例えば、アプリケーションのウィンドウを作ることを考えてみましょう。
ウィンドウを作るには、大きさや背景色、位置などのデータや、それらを操作するための機能が必要になります。
Java で基本的なウィンドウを作るためのクラス(Frame と言います)は初めから用意されており、実際にこれらを操作するための機能(メソッド)がまとめられています。
ちょっと難しいですが、クラスの設計がどのようになっているかを以下のサイトで見ることができます。
ウィンドウを作りたいときは、このクラスをインスタンス化してメソッドを呼び出すことで、簡単にウィンドウを作成することができます。
このように、あるひとまとまりのもの(ウィンドウなど)の設計書となるのがクラスです。
新しくクラスを定義する
クラスの最も基本的な定義方法は以下の通りです。
class クラス名 { // クラスの中身(メソッドなど)を書く }
これまで書いてきたクラスには、先頭に public が付いていましたが、mainメソッドを含まないクラスには必ずしも必要ではありません。public の意味については後ほど紹介します。
以下のプログラムは、2つ目のクラス「Test2」を定義した例です。
public class Test { public static void main(String args[]) { System.out.println("Hello World!"); } } class Test2 { }
このままでは、クラス「Test2」は何もできないクラスですので、メソッドを追加して機能を持たせ、それをクラス「Test」から呼び出してみましょう。
public class Test { public static void main(String args[]) { System.out.println("Hello World!"); // クラス Test2 をインスタンス化 Test2 t = new Test2(); // メソッドを呼び出す t.showText(); } } class Test2 { void showText() { System.out.println("これは新しく定義したクラスのメソッドです!"); } }
クラスのメソッドを呼び出す方法は、前々回に紹介したインスタンス化の手順と同じです。
実行結果は、以下のようになります。
別のクラスの中のメソッドが呼び出せています。
クラスにデータを持たせる
実は、クラスにはメソッドの他に、数値や文字列などのデータを定義することができます。
これをメンバ変数と呼びます。メンバ変数はクラス全体で使えるデータとなります。
メンバ変数を定義するには、メソッドの外側に変数の宣言と代入を書きます。代入を行わなかった場合は、初期値が代入されます。
public class Test { public static void main(String args[]) { System.out.println("Hello World!"); // クラス Test2 をインスタンス化 Test2 t = new Test2(); // メソッドを呼び出す t.showNumber(); t.showNumber2(); } } class Test2 { // メンバ変数を定義する int number = 100; int number2 = 200; String text = "メンバ変数です"; void showNumber() { System.out.println("メンバ変数 number の値は " + number); System.out.println(text); } void showNumber2() { System.out.println("メンバ変数 number2 の値は " + number2); System.out.println(text); } }
実行結果です。メンバ変数はローカル変数とは違い、複数のメソッドから呼び出すことができます。
クラスの実例
クラスの実例として、足し算と引き算だけの計算機のクラスを作ってみましょう。
public class Test { public static void main(String args[]) { // クラス Calculator をインスタンス化 Calculator calc = new Calculator(); // メソッドを呼び出す calc.showAnswer(); calc.plus(2); calc.showAnswer(); calc.plus(6); calc.plus(2); calc.showAnswer(); calc.minus(4); calc.showAnswer(); } } // 計算機のクラス class Calculator { // 計算の結果を保持するメンバ変数 int answer = 0; // 足し算 void plus(int num) { System.out.println(num + " 足します"); answer += num; } // 引き算 void minus(int num) { System.out.println(num + " 引きます"); answer -= num; } // 現在の計算結果を表示 void showAnswer() { System.out.println("現在の値は " + answer + " です"); } }
実行結果は以下のようになります。
クラス Calculator は、引数の値を足したり引いたりするメソッドと、ある時点の計算結果を表示するメソッドを持っています。
計算途中の値がメンバ変数 answer に保持されていますので、何度でも足し算、引き算を行うことができます。