Javaでの抽象クラス

Javaの抽象クラスは、デフォルトのメソッド実装を含めることができるという点を除けば、インターフェースと似ています。抽象クラスは、本体のない抽象メソッドを持つことができ、実装されたメソッドも持つことができます。abstractキーワードは、抽象クラスとメソッドを作成するために使用されます。Javaでは、抽象クラスはインスタンス化できません。抽象クラスは、主にサブクラスが拡張し、抽象メソッドを実装し、抽象クラス内の実装済みメソッドをオーバーライドまたは使用するための基盤を提供するために使用されます。

Javaの抽象クラス

以下は、Javaの抽象クラスの単純な例です。

package com.journaldev.design;

//抽象クラス
public abstract class Person {
	
	private String name;
	private String gender;
	
	public Person(String nm, String gen){
		this.name=nm;
		this.gender=gen;
	}
	
	//抽象メソッド
	public abstract void work();
	
	@Override
	public String toString(){
		return "Name="+this.name+"::Gender="+this.gender;
	}

	public void changeName(String newName) {
		this.name = newName;
	}	
}

work()は抽象メソッドであり、本体を持ちません。以下は、Javaで抽象クラスを拡張した具象クラスの例です。

package com.journaldev.design;

public class Employee extends Person {
	
	private int empId;
	
	public Employee(String nm, String gen, int id) {
		super(nm, gen);
		this.empId=id;
	}

	@Override
	public void work() {
		if(empId == 0){
			System.out.println("Not working");
		}else{
			System.out.println("Working as employee!!");
		}
	}
	
	public static void main(String args[]){
		//抽象クラスを使用したコーディング
		Person student = new Employee("Dove","Female",0);
		Person employee = new Employee("Pankaj","Male",123);
		student.work();
		employee.work();
		//抽象クラスで実装されたメソッドの使用-継承
		employee.changeName("Pankaj Kumar");
		System.out.println(employee.toString());
	}

}

注意してください、サブクラスのEmployeeは、スーパークラスのPersonのプロパティとメソッドをJavaでの継承を使用して継承しています。また、EmployeeクラスでのOverride アノテーションの使用にも注意してください。メソッドをオーバーライドする際には、なぜ常にOverrideアノテーションを使用する必要があるかについては、詳細をご覧ください。

Javaにおける抽象クラスの重要なポイント

  1. abstractキーワードは、Javaで抽象クラスを作成するために使用されます。
  2. Javaでは抽象クラスはインスタンス化できません。
  3. 抽象メソッドを作成するためにabstractキーワードを使用することができますが、抽象メソッドには本体がありません。
  4. クラスに抽象メソッドがある場合、クラスも抽象クラスである必要があります。そうでない場合はコンパイルされません。
  5. 抽象クラスに抽象メソッドがなくても構いません。抽象メソッドを宣言しなくてもクラスを抽象クラスとしてマークすることができます。
  6. 抽象クラスにメソッドの実装がない場合、Javaは複数のクラスの継承をサポートしていないため、インターフェースを使用することが望ましいです。
  7. Javaにおける抽象クラスのサブクラスは、抽象メソッドをすべて実装する必要があります(サブクラスが抽象クラスである場合を除く)。
  8. インターフェースのメソッドは、staticまたはdefaultである場合を除き、暗黙的に抽象です。Java 8では、インターフェースにstaticメソッドとdefaultメソッドが追加されています。詳細については、Java 8のインターフェースの変更を読んでください。
  9. Javaの抽象クラスは、インターフェースのメソッドの実装を提供せずにインターフェースを実装することができます。
  10. Javaの抽象クラスは、すべてのサブクラスに共通のメソッドの実装を提供するために使用されるか、デフォルトの実装を提供するために使用されます。
  11. 抽象クラスにmain()メソッドがある場合、他のクラスと同様に実行できます。

以上がJavaの抽象クラスについてです。重要な点を見落としている場合は、コメントでお知らせください。

Source:
https://www.digitalocean.com/community/tutorials/abstract-class-in-java