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 ポリモフィズムのサンプル