継承とはすでにあるクラスを利用して、カスタマイズできる機能のことです。コピペだと元のクラスを修正したとき、コピペのものも修正しなければいけなくなります。
でも、継承機能を使えば、どれを元にしているかがわかり、あとで見る人にもわかりやすい利点があります。
元となるクラスを「親クラス」といい、継承して作られるクラスを「子クラス」といいます
継承する方法
class 子クラス名 extends 親クラス名 { 親クラスと違う処理 }
これで親クラスのフィールドとメソッドを継承でき、どこが違うのか書き込んでいきます。
子クラスに新機能を作りたいときは、新しいメソッドを作ります。すでにある機能を修正したいときは、もともとのメソッド名にします。上書きになりますね、これをオーバーライドといいます。
コンストラクタは継承されないので、初期化が必要な時はその子クラス用のコンストラクタを作ります。
➀計算問題を「継承」して虫食いクイズを作る
以前、作った「計算問題を1個だけ作るクラスを作ってみる」からの「CalcQuiz.java」を継承して「虫食いクイズ」を作ってみましょう。
出来上がりはこんな感じです。
継承する「CalcQuiz.java」についての解説はこちらをご参照ください。(←「コンストラクタ」より要リンク)
CalcQuiz.java
MushikuiQuiz.java
import java.util.Random; class MushikuiQuiz extends CalcQuiz{ | Randomをインポートします。 継承する方法で書きます。 |
MushikuiQuiz(){ createQuestion(); } | コンストラクタを作ります |
void createQuestion(){ Random rnd = new Random(); int dan = rnd.nextInt(10); int qID = rnd.nextInt(10); this.question = “”; | 問題を1つ作るメソッドを作ります。 変数danはランダムでの0~10の何段かを表し、変数qIDは問題として見せない番号とします。 this.question=””;にて親クラスからの問題文のフィールド(変数)を継承しています。 |
for(int i = 1; i < 10; i++){ if(i == qID){ this.question += "[?]"; } else { this.question += "[" + (dan * i) +"]"; } } | for文で問題文を繰り返します。 問題にして見せない時には「?」を表示し、そうでなければ段数xiとします。 |
this.question += ":?に入る数は何でしょうか"; this.answer = "解答:" + (dan * qID); } } | 問題の文字列と答えの文字列を表示させます。 |
最後にMain.javaでMushikuiQuizインスタンスを作るようにします。
Main.java
import java.util.*; public class Main { public static void main(String[] args) throws Exception { | 最初に実行するクラス |
int quizNum = 3; CalcQuiz [ ]quiz = new CalcQuiz[quizNum]; | 問題数の変数quizNumを作る。 問題を作るインスタンスを入れる配列を作ります。 |
for(int i =1; i < quizNum; i++){ quiz[i] = new MushikuiQuiz(); } | 問題をつくるインスタンスを作る |
for(int i =1; i < quizNum; i++){ System.out.println("問" + i + ":" + quiz[i].getQuestion()); } | すべての問題を表示させるfor文 |
System.out.println("~~~~~~~"); | 問題と答えを区切る区切り線を作る |
for(int i = 1; i < quizNum; i++){ System.out.println("答え" + i + ":" + quiz[i].getAnswer()); } } } | すべての答えを表示するfor文 |
改めて出来上がりはこんな感じです。うまく出来ましたでしょうか?
➁間違い探しクイズを作る
次は、またCalcQuizを継承して間違い探しクイズを作ってみましょう。ここでは「問題の作り方」だけを修正すればいいことになります。出来上がりはこんな感じです。
MistakeQuiz.java
import java.util.Random; class MistakeQuiz extends CalcQuiz{ | ランダムをインポートします。CalcQuizを継承して間違い探しクイズを作るクラスを作ります。 |
MistakeQuiz(){ createQuestion(); } | コンストラクタを作ります |
void createQuestion(){ String[] correct = {“入”,”烏”,”氷”}; String[] mistake = {“人”,”鳥”,”水”}; | 問題を一つ作るメソッドを用意します。 正しい文字と間違い文字をそれぞれ変数に代入します |
Random rnd = new Random(); int qID = rnd.nextInt(correct.length); int answerID = rnd.nextInt(5); this.question = “”; | ランダムで問題の文字の種類と、間違いにする文字の位置を決めます。正しい文字の文字数をlengthにて表示させ、それを変数qIDに代入する。 何文字目が間違いかを変数answerIDに代入します。 this.question=””;にて親クラスからの問題文のフィールド(変数)を継承しています。 |
for(int i = 0; i < 5; i++){ if(i != answerID){ this.question += correct[qID]; } else { this.question += mistake[qID]; } } | for文で文字を繰り返します。5未満で0~4なので5つです。 もし、繰り返した文字が答えと同じでない場合、正しい答えを加えて、そうでなければ、間違った答えを加える。 「変数+=値;」→変数に値を入れて入れ直す |
this.question += “:この中で違う文字は何文字目でしょうか?”; this.answer = (answerID + 1) + “文字目”; } } | 問題の文字列と、答えの文字列を表示させます。 |
Main.java
import java.util.*; public class Main { public static void main(String[] args) throws Exception { | 最初に実行するクラスです。 |
int quizNum = 3; | 問題数を決めます |
CalcQuiz []quiz = new CalcQuiz[quizNum]; | 問題を作るインスタンスを入れる配列 |
for(int i =1; i < quizNum; i++){ quiz[i] = new MistakeQuiz(); } | 問題を作るインスタンスを作ります |
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()); } } } | すべての答えを表示できるようにします。 |
一つ注意としてこんな風に3つのファイルを下記のような状態にしておかないと実行してもエラーになりますのでご注意を!