#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 9. 抽象クラスと「抽象的」 > 9.4 「抽象」って何?
 
前のページへつぎ

9.4 「抽象」って何?

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/04/19
動作確認環境:Windows XP Professional SP2, Java SE 5

 この「抽象クラス」の例も含めて、オブジェクト指向では「抽象」という言葉が良く出てきます。
 でもこの「ちゅうしょう」って、抽象的でわかりにくいです!
 いったいどういう意味なんでしょう。

「実体がない」という意味

 「抽象」は英語の「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」を「抽象的」と訳すのは、日本語における「抽象的」という単語の意味を考えると少々難しいでしょう。
 ですので、「抽象的」という単語を見かけたら「実体のない理論上のもの」と頭の中で置き換えるのがいいでしょう。

9.4 「抽象」って何?
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。