はじめに
Javaにはabstractというキーワードを使ったコードがある。
「abstract」は日本語で「抽象」や「概念」と訳されたりする。
「ざっくりとしたもの」というイメージ。
「動物」という抽象的なまとまりの中に、「犬」や「猫」などの具体的なものがあるといった感じ。
abstractが使えるもの
キーワード「abstract」はクラス、もしくはメソッドに使用することができる。
アクセス修飾子ではないが、「abstract」を使用するにはいろいろと決まりがある。
abstractをクラスに使う場合
abstractが使用されたクラスのオブジェクトは作成することができない。
abstractクラスを使用したければ、「継承」を使ってほかのクラスへ引き継ぎしなければならない。
継承については以下の記事参照。
【Javaプログラミング】継承とは?スーパークラスとサブクラスについても -プロショvol.49
void maguro() {
System.out.println(“おいしい”);
}
}class yakiniku extends sushi{
void beef() {
System.out.println(“最高”);
}
}public class abstractUse {public static void main(String[] args) {
yakiniku Kome = new yakiniku();
Kome.maguro();
Kome.beef();}}
実行すると以下の表示。
最高
「sushi」というクラスに「abstract」がついているため、「sushi」のオブジェクトを直接作ることはできない。
そこで、「sushi」クラスを「yakiniku」クラスに引き継ぎ、「yakiniku」クラスを通して「sushi」クラスを使えるようにした。
yakinikuクラスのオブジェクトを作成し(yakiniku Kome = new yakiniku();)、オブジェクト名とメソッド名を書くことでそれぞれのクラスの書いた内容が処理される。
- 「Kome.maguro();」⇒yakinikuのオブジェクト名とsushiクラスのメソッド名(maguro)。
- 「Kome.beef();」⇒yakinikuのオブジェクト名とyakinikuクラスのメソッド名(beef)。
abstractがついたクラスのオブジェクトを直接作ろうとするとエラーになる。
×「sushi Kome = new sushi();」ダメー。
オブジェクトの作成方法については以下参照。
自作したクラスに状態を表すデータを作る-オブジェクトの作成方法 by Javaプログラミング初心者 Vol.37
abstractをメソッドに使う場合
abstractがついたメソッドは、abstractがついたクラスだけで使用することが可能。
ただし、その場合メソッドの中身は無し。
処理内容などの記述が一切ないメソッドを作成する。
メソッドの中身はabstractがついたクラスを引き継いだクラス(サブクラス)で記述する。
記述しないと逆にエラー。
abstract void maguro();
}class yakiniku extends sushi{
void maguro() {
System.out.println(“最高”);
}
}public class abstractUse {public static void main(String[] args) {
yakiniku Kome = new yakiniku();
Kome.maguro();}
abstractがついたクラスの中に書かれている、abstractのメソッドは「abstract void maguro(); 」と中身の処理内容が書かれていない。
そしてこの中身は、abstractがついたsushiクラスを引き継いだ「yakiniku」クラスに書かれている(void maguro() {System.out.println(“最高”);})。
同じメソッド名。
でも「abstract」は書かない。
メソッドに「abstract」を使用すると「static」を使用することはできない。
使用できるものは「public」と「protected」という修飾子。
public abstract void maguro();
}class yakiniku extends sushi{
public void maguro() {
System.out.println(“最高”);
}
}
あくまでもabstractメソッドと同じ形じゃないとエラー。
abstractメソッドと通常のメソッドを一緒に使う
abstractのクラスの中には、abstractメソッドと一緒に通常のメソッドも書くことができる。
abstract void maguro(); static void engawa() {
System.out.println(“お気に入り”);
}
}class yakiniku extends sushi{
void maguro() {
System.out.println(“最高”);
}
}public class abstractUse {public static void main(String[] args) {
yakiniku Kome = new yakiniku();
Kome.maguro();
sushi.engawa();}
}
staticをつけた「engawa」メソッドを作ってみた。
メソッドに直接staticを付けているため、例えクラスに「abstract」がついていてもオブジェクトを作る必要がない。
通常のメソッドには普通に「static」を付けても大丈夫。
「engawa」メソッドを使用する場合、sushiクラスからそのまま呼び出すことができる(sushi.engawa();)。
メソッドの呼び出し方については以下参照。
自分で作ったクラスの中にメソッドを作る方法 by Javaプログラミング初心者 Vol.40
abstractを使う目的
abstractを使って特定のコードを直接使わせず、必要最低限のものを表示させる。
大人数でコードを作成するときなどに使われる。
段々使われなくなってきている?
最後に
ワードのチョイスを間違えた感じがする。
sushiとyakinikuじゃなくて別のものにしたら良かったと今更ながら思った。
abstractを使ったクラスの名前を「Animal(動物)」とか「Fruit(果物)」にして、abstractクラスを引き継いだクラスを「Cat(猫)」や「Grape(ブドウ)」とかにする。
そうしたら、抽象的なクラスから具体的なクラスになっていく流れが見えたかも?
個人的にはまだ「abstract」っていつ使うの?っていう疑問がぬぐえない。
コメント