【Java】抽象クラス・抽象メソッドについてわかりやすく解説

Java

今回の記事ではJavaの抽象クラス・抽象メソッドについて解説していきます。
クラスやメソッドを定義する前に「abstract」修飾子を付け加えることで抽象クラスや抽象メソッドとして利用することができます。

抽象クラスや抽象メソッドについて実際のソースコードを用いながら解説していきます。
ぜひ最後まで読んでいってください!

「独学だと何から勉強したら良いかわからない」という方にはDig Skillがおすすめです!
Dig Skillでは月1000円でオリジナルのカリキュラムを使ってWebアプリの開発方法を学ぶことができます!30日間の無料体験もあるので、公式サイトをチェックしてみてください!

抽象クラス・抽象メソッドとは

では早速抽象クラスと抽象メソッドについて解説していきます。
最初に抽象メソッドについて解説します。
なぜなら抽象クラスは抽象メソッドを持っているクラスのことを指すからです。

抽象メソッド

それでは抽象メソッドについて解説していきます。
抽象メソッドとは具体的な処理内容が書かれていないメソッドのことです。
オーバーライドすることを強制することができるため、オーバーライド先で処理を書くことを前提としています。

普通のメソッドは次のように宣言します。

void methodName(){
        処理内容...
}

しかし処理内容を記述しない抽象メソッドは次のような書き方をします。

abstarct void methodName();

特筆すべきなのは「abstract」修飾子を付けていることと、メソッド名の後に「;」で終了している箇所です。
この抽象メソッドは継承されたクラスでオーバーライドして処理を記述することになります。

オーバーライドについてはこちらの記事もあわせて読んでみてください。

抽象クラス

抽象メソッドについて理解したところで、次は抽象クラスについて解説していきます。
抽象クラスはクラス内に抽象メソッドが一つでもあるクラスのことです。

普通のクラスは次のように宣言します。

public class ClassName{
         クラスの内容
}

しかし抽象クラスは次のように宣言します。

public abstract class ClassName{
        クラスの内容
}

抽象クラスも抽象メソッドと同じように「abstract」修飾子をつけることで抽象クラスとなります。
抽象クラスの特徴として「new」を使ってインスタンス化できないというものがあります。

抽象クラスには抽象メソッドがあります。
この抽象メソッドには処理が記述されておらず、継承されたクラスでオーバーライドして処理内容を記述する必要があります。

そのため抽象クラスは継承されることを前提としたクラスであり、インスタンス化することができません。

振り返り

一旦抽象クラスと抽象メソッドについて簡単に振り返ります。
まず抽象クラスには次のような特徴があります。

  • 抽象メソッドを持っている
  • インスタンス化できない
  • 継承されることを前提としたクラス

次に抽象メソッドは次のような特徴があります。

  • 処理内容が書かれていない
  • オーバーライドすることで処理内容を確定する

サンプルコード

抽象クラスや抽象メソッドについて理解できたところで、実際のコードを確認して理解を深めましょう。
「Programmer」クラスを作成しました。
このクラスは「programming」という抽象メソッドを持っています。

/**
 * プログラマーの抽象クラス
 */
public abstract class Programmer {
	
	// プログラミングする抽象メソッド
	protected abstract void programming();
}

では「Programmer」を継承したクラスを2つ作成します。
今回は「JavaProgrammer」と「PythonProgrammer」を作成し、それぞれ「Programmer」クラスを継承します。
継承したクラスの中で抽象メソッドである「programming」メソッドをオーバーライドし、処理内容を確定しています。

JavaProgrammer

public class JavaProgrammer extends Programmer {

	@Override
	protected void programming() {
		System.out.println("Javaでプログラミングします");
	}
}

PythonProgrammer

public class PythonProgrammer extends Programmer {

	@Override
	protected void programming() {
		System.out.println("Pythonでプログラミングします");
	}	
}

これらのクラスを実際に使ってみます。

public class Main {

	public static void main(String[] args) {

		// 抽象クラスはインスタンス化できない
		// Programmer pg = new Programmer();
		
		// 抽象クラスを継承したクラスはインスタンス化できる
		JavaProgrammer javaPg = new JavaProgrammer();
		
		// 継承元の型の変数にインスタンスを格納することもできる
		Programmer pythonPg = new PythonProgrammer();
		
		
		// メソッドの実行
		javaPg.programming();
		pythonPg.programming();
	}
}

実行結果は次のようになります。

Javaでプログラミングします
Pythonでプログラミングします

コード解説

コードを詳しくみていきましょう。

抽象クラスはインスタンス化できない

まず抽象クラスは「new」を使ってインスタンス化することができません。
そのため今回はコメントアウトしています。

// 抽象クラスはインスタンス化できない
// Programmer pg = new Programmer();

抽象クラスを継承したクラスをインスタンス化

次にJavaProgrammerをインスタンス化しています。
こちらは抽象クラスを継承している普通のクラスなので、インスタンス化することが可能です。
当然、メソッドの呼び出しもすることができます。

// 抽象クラスを継承したクラスはインスタンス化できる
JavaProgrammer javaPg = new JavaProgrammer();

// メソッドの実行
javaPg.programming();

抽象クラスの型に継承したクラスのインスタンスを格納

最後のPythonProgrammerに関してです。
PythonProgrammerはProgrammerクラスを継承しているため、Programmerクラスの型にインスタンスを格納することが可能です。

もちろんメソッドを呼び出すこともできます。

// 継承元の型の変数にインスタンスを格納することもできる
Programmer pythonPg = new PythonProgrammer();

// メソッドの実行
pythonPg.programming();

今回はJavaの抽象クラス・抽象メソッドについて解説しました。

「独学だと何から勉強したら良いかわからない」という方にはDig Skillがおすすめです!
Dig Skillでは月1000円でオリジナルのカリキュラムを使ってWebアプリの開発方法を学ぶことができます!30日間の無料体験もあるので、公式サイトをチェックしてみてください!

コメント

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