👩🏼‍🏫

【Java】抽象メソッド・抽象クラス

2022/01/28に公開

はじめに

Java Silverの受験にあたって、勉強したことをまとめました。
著作権侵害にならないように気をつけていますが、問題があれば教えてください🙇🏻‍♀️

抽象メソッドとは

詳細未定のメソッド(処理内容を記述しないメソッド)

  • メソッド宣言時にabstractをつける
  • abstractは、「抽象的」「あいまい」という意味

抽象メソッドの構文

public abstract 戻り値 メソッド名(引数リスト);
Character.java
public abstract void attack(Slime s); // 実際にコンパイルするには抽象クラスにする必要がある

抽象クラスとは

抽象メソッドを持つクラスのこと

  • Javaでは、未完成部分(抽象メソッド)を1つでも含むクラスは、abstract付きのクラス(抽象クラス)にする必要がある
  • クラス宣言時にabstractをつける
  • 処理内容をもつメソッド(具象メソッド)も合わせて記述できる
  • 安全な「継承の材料」を実現するために使う(と、スッキリわかるJava入門に書いてあって、とても分かりやすいなと思いました…)

抽象クラスの構文

public abstract class クラス名 {
    // 抽象メソッド
    // 具象メソッドも合わせて記述できる
}
Character.java
public abstract class Character {
    String name;
    int hp;

    // 具象メソッド
    public void run() {
        System.out.println(this.name + "は逃げた");
    }

    // 抽象メソッド
    public abstract void attack(Slime s);
}

では、どうやって使うのか

  1. 抽象クラスを継承したサブクラスを作成する
  2. 元となる抽象クラスの抽象メソッドをすべてオーバーライドする
  3. 未完成部分がなくなり、newすることができる!

→ これで「予期しないインスタンス化」や「オーバーライドのし忘れ」を防ぐことができる!

Dancer.java
public class Dancer extends Character {
    public void dance() {
        System.out.println(this.name + "は踊った");
    }
    // attackメソッドを上書き(オーバーライド)
    public void attack(Slime s) {
        System.out.println(this.name + "の攻撃");
        System.out.println("敵に5ポイントのダメージ");
        s.hp -= 5;
    }
}

抽象メソッドのオーバーライドについて

抽象メソッドには継承によるオーバーライドを強制する効果があるけど…

  • 必ず子クラスですべてオーバーライドする必要はなく、孫クラスやひ孫クラスで最終的にすべてオーバーライドすればよい
  • すべてオーバーライドされたとき、初めてnewを使ってインスタンス化できる

まとめ

  • 抽象メソッドは詳細未定のメソッド
  • 抽象メソッドが1つでもあると抽象クラス
  • 抽象クラスは、継承したサブクラスで実装しないとnewできない
  • 実装とは、抽象メソッドをオーバーライドして処理内容を確定させること

こんな感じかな!
次回はインタフェースについてまとめます!

参考になる書籍

抽象クラス・抽象メソッド・インタフェースは、スッキリわかるJava入門がいちばん分かりやすかったです!
紫本や黒本を何回やっても理解できなかったところが、スッキリ理解できた…
https://book.impress.co.jp/books/1119101083

Discussion