通常のクラスの継承に対して、抽象クラスの継承は何が違うのか、覚えるための自分用メモです。
抽象クラスとは?
抽象クラスでは、一部のメソッドを抽象メソッド(abstract
)として記述することで、継承したサブクラスでのオーバーライド(実装)を強制します。
サンプルプログラム
例えば、以下のクラスをSubClass1
クラスに継承するとします。
SuperClass.java
public abstract class SuperClass {
private String name;
public SuperClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract String talk();
}
以下のようにオーバーライドすれば問題ありませんが、オーバーライドしなかった場合はコンパイルエラーになります。
SubClass1.java
public class SubClass1 extends SuperClass {
public SubClass1(String name) {
super(name);
}
@Override
public String talk() {
return "こんにちは。" + name + "です。";
}
}
また、抽象クラスは直接インスタンス化できないので、単体では使えない「継承のためのクラス」と言えますね。
継承したサブクラスをインスタンス化する
抽象クラスを継承したサブクラスをインスタンス化する記述は、通常のインスタンス化と変わりません。
Main.java
public class Main {
public static void main(String[] args) {
SuperClass superClass = new SubClass1("名前1");
}
}
オーバーライドしたメソッドを呼び出す
オーバーライドした抽象メソッドは、通常のメソッドと同様に呼び出すことができます。
Main.java
public class Main {
public static void main(String[] args) {
SuperClass superClass = new SubClass1("名前1");
print(superClass);
}
static void print(SuperClass superClass) {
System.out.println(superClass.talk());
}
}
実行結果
こんにちは。名前1です。