Java 抽象クラスと抽象メソッドのサンプル(abstract)

Javaの抽象クラスと抽象メソッドのサンプルです。

目次

説明 抽象クラスと抽象メソッドとは
サンプル 抽象クラスと抽象メソッドのサンプル
変数の型が抽象クラスの場合
  抽象クラスの中に通常のメソッドを記述する
  抽象クラスの中に通常のフィールド変数を記述する

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

抽象クラスの宣言

アクセス修飾子 abstract  class  クラス名 {
  アクセス修飾子 abstract 戻り値の型 メソッド名(引数){ // ←抽象メソッドです
   }
}
  • 抽象クラスと抽象メソッドは、abstractというキーワードを指定します。
    →抽象メソッドが1つでもあると抽象クラスになり、クラスの前にabstractをつけます。
  • 抽象メソッドは、継承先でメソッドのオーバーライドを強制します。
  • 抽象メソッドは、メソッドの定義はしますが、処理内容は記述しません。
    →処理内容は、抽象クラスを継承したクラスで記述します。
  • 継承先のクラスから見て継承できる抽象クラスは1つのみです。
  • 抽象クラス自体はインスタンス化できません。
  • インスタンスの生成で、代入する変数の型を抽象クラスにすることも可能です。その場合、指定した抽象クラスのメソッドのみ使用できます。

抽象クラスを継承する書き方

class クラス名 extends 抽象クラス名{
}

抽象クラスの前にextendsを付けます。

 

抽象クラスと抽象メソッドのサンプル

package test1;

abstract class AbstractTest { //抽象クラス
	abstract void print1(); //抽象メソッド
}
class TestA extends AbstractTest { //抽象クラスを継承
	@Override
	public void print1() { //オーバーライド
		System.out.println("1");
	}
}
public class Test1 {
	public static void main(String[] args) {
		TestA ta = new TestA();
		ta.print1(); // 1
	}
}

6行目は、抽象クラスをextendsで継承しています。
7行目は、@Overrideアノテーションです。親クラスのメソッドがオーバーライドされていない場合、コンパイルエラーになります。
8行目は、4行目の抽象メソッドをオーバーライドしています。メソッドの具体的な処理内容を記述します。

変数の型が抽象クラスの場合

変数の型が抽象クラスの場合のサンプルです。

package test1;

abstract class AbstractTest { //抽象クラス
	abstract void print1(); //抽象メソッド
}
class TestA extends AbstractTest {
	@Override
	public void print1() { //オーバーライド
		System.out.println("1");
	}
	public void print2() {
		System.out.println("2");
	}
}
public class Test1 {
	public static void main(String[] args) {
		AbstractTest tab = new TestA();
		tab.print1(); // 1
//		tab.print2(); コンパイルエラー
	}
}

17行目の変数の型は、抽象クラスの型(AbstractTest)です。
18行目のprint1メソッドは、抽象クラスにあるので実行できます。
19行目のprint2メソッドは、抽象クラスにないのでコンパイルエラーになります。

抽象クラスの中に通常のメソッドを記述する

抽象クラスの中に通常のメソッドを記述することは可能です。

package test1;

abstract class AbstractTest { //抽象クラス
	abstract void print1(); //抽象メソッド
	
	void print2() {
		System.out.println("test1"); //通常のメソッド
	}
}
class TestA extends AbstractTest {
	@Override
	public void print1() {
	}
}
public class Test1 {
	public static void main(String[] args) {
		TestA ta = new TestA();
		ta.print2(); // test1
	}
}

6~8行目は、抽象クラスの中に通常のメソッドがあります。
18行目は、抽象クラスにある通常のメソッドを実行しています。

抽象クラスの中に通常のフィールド変数を記述する

抽象クラスの中に通常のフィールド変数を記述することも可能です。

package test1;

abstract class AbstractTest { //抽象クラス
	int num1 = 1; //通常のフィールド変数
	
	abstract void print1(); //抽象メソッド
}
class TestA extends AbstractTest {
	@Override
	public void print1() {
	}
}
public class Test1 {
	public static void main(String[] args) {
		TestA ta = new TestA();
		System.out.println(ta.num1); //1
	}
}

4行目は、抽象クラスの中に通常のフィールド変数があります。
16行目は、抽象クラスにある通常のフィールド変数の値を表示しています。

関連の記事

Java インターフェースのサンプル(interface)
Java ポリモーフィズムのサンプル(多態性)

△上に戻る