抽象クラスやインターフェイスについてまとめてみた
Javaにボッコボコにやられる毎日です。
今回は抽象クラスやインターフェイスの難しかったところをまとめてみます。
抽象クラスとは
抽象クラスは処理が定義されていない状態のメソッドを持ちます。つまり、オブジェクトを作成することができません。抽象クラスのメソッドを抽象メソッドと言います。
abstract class クラス名{ フィールド abstract メソッド }
と記述します。
抽象クラスの使い方は、抽象クラスから継承したメソッドをサブクラスでオーバーライドして処理を定義して使います。サブクラスでオーバーライドすれば、サブクラスのオブジェクトは作ることができます。抽象クラスはオブジェクトは作れなくても、変数や配列を用意して、サブクラスのオブジェクトを示すことはできます。
そもそもなぜこんなものが必要なのか。
例えば
「乗り物」の抽象クラスを用意します。そして「車」クラス、「バイク」クラス、「船」クラスを用意します。この3つは「乗り物」クラスを継承して、そのメソッドをオーバーライドしています。こうすることで、「乗り物」クラスの変数や配列を使うことで、車、バイク、船の3つのクラスをまとめて扱うことができます。バラバラに扱うよりもずっと簡単なんです。
インターフェイス
抽象クラスに似てるやつ。しかし抽象クラスとは少し違う点もあります。まずは書き方
interface インターフェイス名{ public static final フィールド = 値 //フィールドは必ず初期化する public abstract メソッド }
このように書きます。フィールドのpublic static finalと、メソッドのpublic abstractはなくても自動的に付けている状態になります。ですから、本来は省略できます。注意点としてインターフェイスのメソッドは抽象メソッドであること、またコンストラクタは持たないこと、があります。ちなみに抽象クラスはコンストラクタを持てます。
メソッドが抽象メソッドなので、抽象クラスと同じようにインターフェイスはオブジェクトを作成することはできません。
インターフェイスをクラスと合わせることを「実装する」と言います。例えば、AクラスにBインターフェイスを実装する書き方は
class A implements B
となります。
多重継承
2つ以上のクラスを継承したサブクラスを使いたいような継承を多重継承と呼ぶ。しかしJavaではクラスの多重継承はできません。では、どうするのか。インターフェイスを2つ以上実装します。書き方はimplementsで1つ目を実装した後に、コンマで区切って続けてインターフェイス名を書くだけです。
なぜこのような仕組みが必要なのか。
例えば、「スマホ」クラス、「ガラケー」クラスがあるとします。そしてインターフェイスとして、「電話をかける」「カメラを使う」「ワンセグを使う」の3つがあるとします。このとき多少強引ですが、スマホは電話をかける、とカメラを使う、のみを使えて、ガラケーは、電話をかける、とワンセグを使うのみができることとします。(良い例えが思いつきませんでしたすいません)
このとき
class スマホ implements 電話をかける, カメラを使う class ガラケー implements 電話をかける, ワンセグを使う
とこのように書くことができます。こうやってクラスやインターフェイスが増えたときに多重継承が行えるとさらに便利ですねっていう。