プログラミング入門 Java インスタンス化されたくない場合は抽象クラスにしよう

Javaの継承を使うと柔軟なコードを書くことができますが、スーパークラスを直接使われたくない場合はどうしたら良いでしょうか。

以下のコードでは、Personというスーパークラスを継承してTamibouzクラスを作成しています。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Person p = new Tamibouz();
        System.out.println(p.sayHello());
    }
}

class Person {
    String sayHello() {
        return "サブクラスで実装してね";
    }
}

class Tamibouz extends Person{
    public String sayHello(){
       return "Hello Tami";
    }
}

しかし、以下のように直接Personクラスを使うこともできます。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        System.out.println(p.sayHello());
    }
}

class Person {
    String sayHello() {
        return "サブクラスで実装してね";
    }
}

class Tamibouz extends Person{
    public String sayHello(){
       return "Hello Tami";
    }
}

Personクラスはとてもふわふわとしたクラスなので、このクラスを直接使いたくないとします。

そのようなときは抽象クラスにします。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        System.out.println(p.sayHello());
    }
}

abstract class Person {
    abstract String sayHello();
}

class Tamibouz extends Person{
    public String sayHello(){
        return "Hello Tami";
    }
}

class Person の頭に abstract をつけただけです。

抽象クラスはインスタンス化できないので、上記のコードではコンパイル時にエラーになります。

Person is abstract; cannot be instantiated
        Person p = new Person();

スーパークラスを直接インスタンスさせないで、必ず継承してサブクラスを作って欲しい!というときには、abstract をつけて抽象クラスにすることを検討すると良いでしょう。