【Javaプログラミング】abstract(抽象:アブストラクト)クラスとメソッドとは?-プロショvol.56

スポンサーリンク
Java攻略
スポンサーリンク

はじめに

 

Javaにはabstractというキーワードを使ったコードがある。

「abstract」は日本語で「抽象」や「概念」と訳されたりする。

「ざっくりとしたもの」というイメージ。

動物」という抽象的なまとまりの中に、「犬」や「猫」などの具体的なものがあるといった感じ。

 

abstractが使えるもの

 

キーワード「abstract」はクラス、もしくはメソッドに使用することができる。

アクセス修飾子ではないが、「abstract」を使用するにはいろいろと決まりがある。

 

abstractをクラスに使う場合

 

abstractが使用されたクラスのオブジェクトは作成することができない。

abstractクラスを使用したければ、「継承」を使ってほかのクラスへ引き継ぎしなければならない。

 

abstract class sushi{
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();ダメー。

 

 

abstractをメソッドに使う場合

 

abstractがついたメソッドは、abstractがついたクラスだけで使用することが可能

ただし、その場合メソッドの中身は無し

処理内容などの記述が一切ないメソッドを作成する。

 

メソッドの中身はabstractがついたクラスを引き継いだクラス(サブクラス)で記述する。

記述しないと逆にエラー。

 

abstract class sushi{
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」という修飾子

abstractメソッドで「public」や「protected」を使うと、処理内容を書くメソッドにも同じものを使用しなければいけない。
abstract class sushi{
public abstract void maguro(); 
}class yakiniku extends sushi{
public void maguro() {
System.out.println(“最高”);
}
}

あくまでもabstractメソッドと同じ形じゃないとエラー。

abstractメソッドと通常のメソッドを一緒に使う

 

abstractのクラスの中には、abstractメソッドと一緒に通常のメソッドも書くことができる

abstract class sushi{
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();)。

 

 

abstractを使う目的

 

abstractを使って特定のコードを直接使わせず、必要最低限のものを表示させる。

大人数でコードを作成するときなどに使われる。

段々使われなくなってきている?

 

最後に

 

ワードのチョイスを間違えた感じがする。

sushiとyakinikuじゃなくて別のものにしたら良かったと今更ながら思った。

 

abstractを使ったクラスの名前を「Animal(動物)」とか「Fruit(果物)」にして、abstractクラスを引き継いだクラスを「Cat(猫)」や「Grape(ブドウ)」とかにする。

そうしたら、抽象的なクラスから具体的なクラスになっていく流れが見えたかも?

 

個人的にはまだ「abstract」っていつ使うの?っていう疑問がぬぐえない。

 

 

このエントリーをはてなブックマークに追加

コメント

タイトルとURLをコピーしました