tanish-kr's learning log

Learning output log

Java

1. 抽象クラスとは

抽象クラスはクラス宣言に&bold(){abstract}キーワードを付けたクラスです。abstractをつけることにより定義が完結していないことを示します。 これに対して一般のクラスを具象クラスといいます。 抽象クラスは、それを継承したサブクラスが抽象メソッドの内容を書いて具象クラスにしないといけません。サブクラスが処理定義をオーバライドするよう強制するクラスが抽象クラスです。

  • クラス宣言にabstractキーワードを付けたクラスを抽象クラスという。
  • 処理定義がなく末尾にセミコロンを付けたメソッドを抽象メソッドという。

1-1. 抽象クラスの規約

  • 抽象クラスはオブジェクトを作成できない
  • クラス宣言にabstractキーワードをつけたものが抽象クラスである
  • サブクラスはすべての抽象メソッドを実装しなくても良い
  • サブクラスでのオーバライドはオーバライドの規約に従う

2. 抽象クラス変数

//スーパークラス(抽象クラス)
abstract class Parent {
  public abstract void show();
}
//サブクラス
class Child extends Parent {
  //実装したメソッド
  public void show() {
    System.out.println("show_method");
  }
}

//抽象クラスの変数を使う
public class Exec {
  public static void main(String[] args){
      Parent p = new Child();   //p は抽象クラスParent型の変数
      p.show();
  }
}

3. インタフェースとは

インタフェースはクラスではありませんが、クラスに準じる存在です。定数や抽象メソッドだけからなるのが特徴で、その点では抽象クラスに似ています。 使い方も抽象クラスとそっくりです。クラスでは継承というところをインタフェースでは、実装といいます。インタフェースを実装するクラスは、インタフェースが定義している抽象メソッドをオーバライドしなければなりません。 ただ、抽象クラスと違う点は、インタフェースはクラスではないので継承関係を考慮しなくて良いということです。

3-1. 単一継承の欠点を補う

インタフェースはクラスではないので、インタフェースを実装することで、複数のクラスを継承するのと同じような効果を上げることが出来る。 継承とは無関係に、クラスに「特定の機能を付加する」ために使います。

3-2. 公開メソッドを明確にする手段として使う

インタフェースは特定の機能を実現するために必要な定数や抽象メソッドの集まりです。また、インタフェースで定義する定数や抽象メソッドはすべてpublicでなくてはならないという規則があります。 クラスでpublicにするメソッドをすべてinterfaceとして定義し、それを実装してクラスを作成することで、interfaceを見るだけで利用できるメソッドがわかるので、クラスの外界とのインタフェースを定義するということになります。

//Toolsインタフェース
public interface Tools {
  public static final int MAX = 5000;  //public static finalは省略可
  public abstract void disp();              // public abstract は省略可
}

3-3. static

staticをつけたフィールドやメソッドは、クラス定数、クラスメソッドといい、クラスに一つしかない、固有のもの。 静的メンバと呼ばれ、クラスから作成されたオブジェクトは静的メンバに自由にアクセスできる。

3-4. final

finalは「変更できない」という意味の修飾子。宣言時に必ず値を代入しないと行けない。

対象 用例 効果
クラス final class Foo{} 継承できない
メソッド final int doIt(){} サブクラスでオーバライドできない
変数 final int MAX = 500; 初期化時に代入した値を後から変更できない

4. インタフェースの実装

  • implementsキーワードを使ってインタフェースを実装する
  • 一度に複数のインタフェースを実装できる
  • クラスの継承(extends)と併用できる
interface Tools {
  int MAX = 500;
  void disp();
}

interface Var {
  int SUM = 1000;
}

class Parrent {
  int n;
}

class Child extends Parent implements Tools,Var{
  public void disp(){  //publicをつける
    System.out.println(n);
  }
}

5. インタフェース宣言での注意事項

  • interface宣言には暗黙的にabstractが付いている
  • interfaceのメソッドには暗黙にpublic abstractがついている
  • interfaceの定数は暗黙的に public static final である

6. インタフェース実装での注意事項

  • 1つのクラスに複数のインタフェースを実装できる
  • 複数のインタフェースを継承できる
  • abstractクラスにすることで一部のメソッドだけを実装できる

7. インタフェース変数

継承と同じ扱いで、矢印の方向に自動型変換が可能