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

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

目次

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

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

コード

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

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
	}
}

3行目は、クラスの前にabstractがついています。抽象クラスです。
4行目は、メソッドの前にabstractがついています。抽象メソッドです。抽象メソッドには処理内容を記述しません。
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 クラスの仕組みと使い方のサンプル
Java クラスの継承のサンプル
Java コンストラクタのサンプル
Java インターフェースのサンプル(interface)
Java ポリモフィズムのサンプル

△上に戻る