「new クラス名()」でインスタンスが作成されるとき、コンストラクタというメソッドが実行されます。ただ初期値が必要な場合もあり、そういうときの設定を行うとき「コンストラクタ」を使います。オブジェクトの初期化のために作成する特別なメソッドになります。
書式;コンストラクタ クラス名{ インスタンスが作成されるときに行う処理 }
普通のメソッドとそっくりですが、名前には「クラス名と同じ名前」を使い、戻り値がないので戻り値の型を指定しないところが違います。
計算問題を1個だけ作るクラスを作ってみる
まずは「CalcQuiz.java」という新規ファイルを作ります。
CalcQuiz.java
import java.util.Random; class CalcQuiz { | Randomが使える準備をします。 計算問題を1個だけ作るクラスを作ります。 |
String question; String answer; | 問題を保存するフィールド(クラスが持っている変数のこと) と答えを保存するフィールドを作ります。 |
CalcQuiz(){ createQuestion(); } | コンストラクタを作ります(引数がないので「デフォルトコンストラクタ」となる(下記参照))。書式は→ クラス名{ インスタンスが作成されるときに行う処理 } |
void createQuestion(){ Random rnd = new Random(); int a = rnd.nextInt(100); int b = rnd.nextInt(100); question = a + “x” + b + “=?”; answer = Integer.toString(a * b); } | ランダムに問題を1つ作るメソッドを作ります。 書式は→void メソッド名(){ メソッドで行う処理 } かける数はそれぞれ0~100までとしてます。 数字を文字列に変換する「 Integer.toString」で(a * b)を文字列にしてます。 |
String getQuestion(){ return question; } | 問題を出してくれるメソッドを作って、フィールドに保存されている問題の文字列を返します。 |
String getAnswer(){ return answer; } } | 答えを教えてくれる部分もメソッドを作って、フィールドに保存されている答えの文字列を返します。 |
そしてこのクラスを試すために、Main.javaでインスタンスを作ります。メソッドをそれぞれ呼び出してみましょう。
Main.java
import java.util.*; public class Main { public static void main(String[] args) throws Exception { CalcQuiz q = new CalcQuiz(); | 「CalcQuiz q = new CalcQuiz();」にてクイズを出すインスタンスを作ります。 書式→「クラス名 変数名 = new クラス名();」 |
System.out.println(q.getQuestion()); System.out.println(q.getAnswer()); } } | 問題を出すメソッド、答えを出すメソッドにアクセスします。 |
補足として「コンストラクタ」に戻り値はありませんが、引数をつけることはできます。インスタンスを作成するときに、引数で値を渡して初期設定を変化させることができます。
引数のあるコンストラクタは、変化をつけたいとき用のコンストラクタなので、引数のない普通のコンストラクタほうを「デフォルトコンストラクタ」と呼びます。
複数ある計算問題を作ってみよう
for文を使ってたくさんあるデータを繰り返します。クイズを作り出すクラスは出来ているので、それを呼び出すMain.java側の修正をしていきます。
Main.java
import java.util.*; public class Main { public static void main(String[] args) throws Exception { | 最初に実行するクラス |
int quizNum = 4; | 問題数を変数に代入して用意します。あとで自由に問題数を変更できるため。 |
CalcQuiz [ ]quiz = new CalcQuiz[quizNum]; | 問題を作るインスタンスを入れる配列 |
for(int i = 1; i< quizNum; i++){ quiz[i] = new CalcQuiz(); } | 問題を作るインスタンスを作ります。初期値を1とし、4未満まで、すなわち1,2,3まで問題をインクリメント(変数に1を足す)させます。 |
for(int i = 1; i < quizNum; i++){ System.out.println("問題" + i + ":" + quiz[i].getQuestion()); } | すべての問題を表示させための処理を書きます |
System.out.println("--------"); | 問題と答えとの間に点線を引きます |
for(int i = 1; i < quizNum; i++){ System.out.println("答え" + i + ":" + quiz[i].getAnswer()); } } } | すべての答えを表示させる処理を書きます |