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行目は、抽象クラスにある通常のフィールド変数の値を表示しています。
関連の記事