この「抽象クラス」の例も含めて、オブジェクト指向では「抽象」という言葉が良く出てきます。
でもこの「ちゅうしょう」って、抽象的でわかりにくいです!
いったいどういう意味なんでしょう。
「実体がない」という意味
「抽象」は英語の「abstract」を訳したものです。
英英辞典「Compact Oxford English Dictionary」で「abstract」を調べると、「theoretical rather than physical or concrete」と書かれています。
「physical」は「物理的」という意味になります。
また、「concrete」は「実体がある」という意味で、オブジェクト指向では「インスタンス」とほぼ同じ意味で使われています。
それらより「rather than」なので、「abstract」は「physical」や「concrete」ではない、ということになります。
ここで、前のページを振り返ってみましょう。
抽象クラスはインスタンスを作れませんでした。
AbstractClass ref = new AbstractClass();
// コンパイルエラー:
// AbstractClassRunner.java:18:
// AbstractClass は abstract です。
// インスタンスを生成することはできません。
// AbstractClass ref = new AbstractClass();
// ^
// 抽象クラスはインスタンスを作れません! AbstractClass ref = new AbstractClass(); // コンパイルエラー: // AbstractClassRunner.java:18: // AbstractClass は abstract です。 // インスタンスを生成することはできません。 // AbstractClass ref = new AbstractClass(); // ^
抽象クラスは「中身のないメソッドを作る可能性がある」ので、インスタンスを作ることができませんでした。
つまり、「abstract」は「インスタンスを作れない、実体を持たないクラス」ということを意味している、と言えます。
「インスタンスを作ることができないクラス」という印として、abstractがクラスの前に付けられている、と考えるといいでしょう。
「理論上」という意味
もうひとつ「abstract」の意味を考えてみます。
先ほどの英英辞典の説明をもう一度見てみましょう。
そこには「theoretical rather than physical or concrete」と書かれていました。
「theoretical」は「理論上」という意味です。
ここで、「9.1 abstractクラスとabstractメソッド」の、抽象クラスの使用例を思い返してみましょう。
refSuper.printMyName();
// 実行結果:
// ConcreteSub
// オーバーライドしたメソッドを呼び出します。 refSuper.printMyName(); // 実行結果: // ConcreteSub
refSuper変数はスーパークラス、つまり抽象クラスの参照型変数です。
そして、printMyName()メソッドはその抽象メソッドです。
このメソッド、抽象メソッドですから実体は存在しません。でも、参照先のインスタンスには存在しているはずです。
つまり、このメソッド呼び出しは「理論上存在するであろうprintMyName()メソッドを呼び出している」ということです。
printMyName()メソッドは理論上その実体が存在するであろうと思われ、そして理論上は「自クラスの名前を出力する」という処理を行うはず、というメソッドです。
実際にどのクラスのインスタンスに中身があり、どういう結果を出すかは「実行してみなくちゃ分からない」ので、「理論上」なのです。
「abstract」には、上記のような意味が含まれています。
つまり、「abstract class」を日本語に訳せば「実体のない理論上のクラス」となるでしょう。
このような意味の「abstract」を「抽象的」と訳すのは、日本語における「抽象的」という単語の意味を考えると少々難しいでしょう。
ですので、「抽象的」という単語を見かけたら「実体のない理論上のもの」と頭の中で置き換えるのがいいでしょう。