👩🏼🏫
【Java】抽象メソッド・抽象クラス
はじめに
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);
}
では、どうやって使うのか
- 抽象クラスを継承したサブクラスを作成する
- 元となる抽象クラスの抽象メソッドをすべてオーバーライドする
- 未完成部分がなくなり、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入門がいちばん分かりやすかったです!
紫本や黒本を何回やっても理解できなかったところが、スッキリ理解できた…
Discussion