Java の抽象クラス・インターフェイスについて

本日のTIL

今日は 前回 予告した通り Java の抽象クラスとインターフェイスについてまとめます。

抽象クラス

abstract という修飾子をつけることで 抽象クラス を作ることができます。

特徴

  • オブジェクトを作成することができない
    • new して作れないってこと。
    • 抽象クラスの変数や配列は準備してサブクラスのオブジェクトをさすことはできる。
  • 処理内容が定義されていないメソッド ( 抽象メソッド – abstract method )を持っている。
    • abstract というキーワードをつけてメソッドを定義すると抽象メソッドに。
  • サブクラスを拡張することができる。
    • ただし、 抽象クラスから継承した抽象メソッドの内容をサブクラスで定義、オーバーライドしなければならない
    • サブクラスは必ずその抽象クラスのメソッドを持っているので、まとめて簡単に扱える。

インターフェイス

宣言

こんな感じ↓

interface iVehicle {
    void show(); // 抽象メソッド
}

特徴

  • interface を使って宣言する。
  • フィールドとメソッドを持つことができる。
  • コンストラクタは持たない。
  • フィールドは必ず初期化する。
  • メソッドの処理は定義しない。
  • メンバには何も修飾子をつけない。
    • 何もつけなくても、フィールドには public static final, メソッドには abstract がついているのと同じことに。
    • つまりフィールドは絶対定数で、メソッドは抽象メソッド。
  • オブジェクトを作成することはできません。
    • 変数・配列を宣言することはできる。
  • クラスと組み合わせて使うことになっている。
    • クラスと組み合わせることを インターフェイスを実装する という。

使い方

インターフェイスの実装

class <クラス名> implements <インターフェイス名> {
    /*
        hogehoge
        fugafuga
        piyopiyo
    */
}

さて、このようなクラスを作ったら、インターフェイスのメソッドをすべて定義する という作業が必要になります。 インターフェイス型の配列は、そのインターフェイスを実装しているサブクラスのオブジェクトを指すことができます。インンターフェイスも、上で見た抽象kルアスと同じように サブクラスをまとめて扱うことができます

2つ以上のインターフェイスの実装

Java は2つ以上のスーパークラスを持つサブクラスを認めていません。 ただし、 クラスは2つ以上のインターフェイスを実装することができます 。 この場合、実装したインターフェイスすべてののメソッドの処理内容を定義しなければなりません。

インターフェイスの拡張

インターフェイスはクラスと同じように、 拡張して新しいインターフェイスを宣言することができます 。拡張される方を スーパーインターフェイス , 拡張した方を サブインターフェイス といいます。

interfaxe <サブインターフェイス名> extends スパーインターフェイス名1, スーパーインターフェイス名2, ・・・
{
     ・・・   
}

所感

抽象クラスとインターフェイスがあればクラスの継承ってあんまりやらなくない??って思いました。というか、できるだけ抽象クラスかインターフェイスの継承をした方がいいのかなあと。 これは Rails をやっていたからもしれませんが、継承って繰り返すと何がどうなってるのかどんどんわからなくなるイメージがあって、でも抽象クラスやインターフェイスがあればだいぶそれが軽減される気がしたので。 実際、Java を書くときはできるだけクラスの継承ではなく抽象クラスの継承やインターフェイスの実装にしようみたいな動きってありますか? みなさんコメントでいろいろお話してくださると嬉しいです!

 
comments powered by Disqus