カテゴリー
Java

クラスの継承について知ろう

この章ではクラスの継承について説明します。
クラスの継承とは親クラスの他に、もう1つの関連したクラスを作ろうとした時に親クラスのフィールド変数やメソッドを引き継ぐことを言います。
親クラスとは継承の基本となるクラスで、このクラスを基本に他のクラスが親クラスのフィールド変数などを使うことになります。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで使わなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスでは独自のフィールド変数やメソッドを追加することもできます。
このように親クラスに使いたいメソッドとフィールド変数があって、さらに子クラスに新たなメソッドやフィールド変数を加えたい時にクラスの継承を使います。
継承の構文は以下の通りです。1 では例を見てみましょう。
次の例は親クラスの「Banksystem.java」です。111111 次の例は「Securities.java」です。11111 結果は以下の通りです。1 ではクラスの継承について説明します。
この例の継承は以下の箇所です。スペースの都合で2行で書いていますが、通常は1行で書きます。1 親クラスがBanksystemクラスで、子クラスがSecuritiesクラスです。
子クラスは親クラスのフィールド変数やメソッドを継承できるので親クラスのメソッドや変数を以下のように使うことができます。1 子クラスのSecuritiesクラスのオブジェクトを作成しているのにも関わらず、setNameメソッドなど親クラスのメソッドを使うことが出来ているのが分かります。
子クラスでは親クラスのフィールド変数やメソッドを使うだけではなく、子クラス独自のフィールド変数やメソッドも作成することが出来ます。
それがcompany変数、companyBanknameメソッド、stockbuyメソッド、stocksellメソッドです。
Securitiesクラスのmainメソッドで以下の通り、子クラスのメソッドとプロパティを実行しています。1

次にオーバーライドについて説明します。
子クラスで改めて親クラスのメソッドやフィールドを書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを子クラスで書いています。
それはresultメソッドです。11 このように子クラスと親クラスで同じ名前のメソッドを作ることが出来て、子クラスのメソッドでは内容だけ親クラスと違う内容で書くことができます。
これをオーバーライドと言います。
この例では親クラスのresultメソッドの中の1を子クラスのresultメソッドで1に変更しました。
では次に進みます。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスでは使用することはできません。
この例の親クラスのフィールド変数のアクセスレベルにはprotectedが付いていますが、このアクセスレベルをprivateに書き換えると以下の通りになります。1 このようにprivate指定したフィールド変数は次のように子クラスから親クラスのフィールド変数にアクセスすることはできません。1 ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスのフィールド変数やメソッドにアクセスできることを意味します。1 [補足]
フィールド変数に直接、値を入れるのではなく、メソッドで値をチェックしてから値を入れるのもいいでしょう。
例では以下のようなメソッドでフィールド変数に値を入れています。
ここでは名前に何も入力していない場合は「カラ」と、出力するようになっています。1 また、以下のgetNameメソッドはsetNameメソッドで得たmynameの値を返すためのメソッドです。1 setNameメソッドは値をセットするためのメソッドで、getNameメソッドは値を返すためのメソッドです。
このようにフィールド変数に値をセットしたり、値を返したりするには「値をセットするためのメソッド」「値を返すためのメソッド」と別ける場合が多いです。
値をセットするためのメソッド名は先頭にsetを付け、値を返すためのメソッドは先頭にgetを付けるのが慣習になっています。

もう1つ継承の例を見てみましょう。
次の例は親クラスの「Vehicle.java」です。111 次は継承クラスの「Used.java」です。1111 結果は以下の通りです。1 この例では以下のようにVehicleクラスを継承したusedクラスを作成しています。
class Used extends Car{
}

次に継承におけるコンストラクタの動きについて説明します。1 =>子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。
その後に子クラスのコンストラクタが呼ばれることになります。
つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
この例では以下の通り、引数の無いコンストラクタも引数のあるコンストラクタも両方書いてあるので問題ありません。1 自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合にエラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、一つ目の方法は先ほど説明した通り、親クラスに引数の無いコンストラクタを作る方法です。
二つ目の方法は子クラスのコンストラクタの中で1を使う方法です。
では例をみてみましょう。
次の例は親クラスの「Vehicle.java」です。11
次の例は子クラスの「Used.java」です。1111 以下の箇所がsuperを使用した箇所です。1 superとは親クラスのことであり、子クラスのインスタンスメソッドやコンストラクタの中で親クラスのフィールド変数、メソッド、コンストラクタに接続することが出来ます。
この例は子クラスのコンストラクタの中で親クラスのコンストラクタを呼び出しています。
super()を使って親クラスのコンストラクタを呼び出す時には、子クラスのコンストラクタの中の1行目に書いてください。1 次の図の通り、superは親クラスのコンストラクタを呼び出して親クラスのフィールド変数に値を代入しています。
「フェラーリ、10、5」は親クラスのフィールド変数に入り、「60000、あり」は子クラスのフィールド変数に入ります。
ですので、コンストラクタの数は5つ必要です。1 super()を使うことで親クラスに引数の無いコンストラクタを書く必要がなくなります。