連載
» 2008年05月08日 00時00分 公開

プログラマーの常識をJavaで身につける(11):いまさら聞けないJavaによるオブジェクト指向の常識 (2/5)

[伊賀敏樹, 山本耕司,株式会社 NTTデータ ビジネスブレインズ]

JavaにおけるClassとObject

 Java言語をご存じの皆さんにとって、クラスオブジェクトは、すでになじみが深いことと思います。ここからは、ラーメン屋を例に話を進めていきましょう。

取りあえず、ラーメンをクラスで表すと……

 早速、ラーメンを表すラーメン・クラスを考えてみましょう。

図1 ラーメンの調理方法 図1 ラーメンの調理方法(こちらの図はJavaプログラミング[アプリケーション編]ステップアップラーニング』(技術評論社)で使われた図を引用して再作成したものです)

 Java言語でラーメン・クラスを表すと、例えば以下のようになります。

Ramen.java
/**
* ラーメン・クラス
*/

public class Ramen {
    /**
    * ラーメンのスープ
    */

    private String fSoup = null;

    /**
    * ラーメン・クラスのコンストラクタ
    */

    public Ramen() {
        // スープに「とんこつ」をセット
        fSoup = "とんこつ";
    }
    /**
    * ラーメンを表示
    */

    public void showRamen() {
        System.out.println("ラーメンを表示");
        System.out.println(" スープ : " + getSoup());
    }
    /**
    * ラーメンのスープを取得
    *
    * @return スープ
    */

    public String getSoup() {
        return fSoup;
    }
}

 おいしいラーメンが出来上がる気持ちがしてきましたか?

次に、ラーメンを作る料理人をクラスで表すと……

 先ほどのラーメン・クラスを使って、実際のラーメンに当たるラーメン・オブジェクトを作ってみます。とはいえ、ここはラーメン屋なので、ラーメン料理人にラーメンを作ってもらいましょう。

図2 ラーメン屋で働く料理人 図2 ラーメン屋で働く料理人(こちらの図はJavaプログラミング[アプリケーション編]ステップアップラーニング』(技術評論社)で使われた図を引用して再作成したものです)

 ラーメン料理人クラスは、注文を受けると、ラーメン・クラスのインスタンスを作ります。

RamenCook.java
/**
* ラーメン料理人クラス
*/

public class RamenCook {
    /**
    * ラーメンの注文を受ける
    *
    * @return ラーメン・インスタンス
    */

    public Ramen acceptRamenOrder() {
        // ラーメン・クラスからラーメン・クラスのインスタンスを作成
        final Ramen ramen = new Ramen();

        // 作成されたラーメン・インスタンスをreturnする
        return ramen;
    }
}

さらに、ラーメン屋のお客をクラスで表すと……

 では、ラーメン料理人に、実際にラーメンを作ってもらうために、ラーメン料理人にラーメンを注文する「ラーメン屋のお客」クラスを登場させましょう。

Customer.java
/**
* ラーメン屋のお客
*/

public class Customer {
    public static void main(final String[] args) {
        // ラーメン料理人・インスタンスを作成する
        final RamenCook cook = new RamenCook();

        // ラーメン料理人にラーメンを注文する
        final Ramen ramen = cook.acceptRamenOrder();

        // 出来上がったラーメンを表示する
        ramen.showRamen();
    }
}

 ラーメン屋のお客は、ラーメン料理人にラーメンの注文をすることにより、ラーメンを受け取ることができます。出来上がったラーメンを表示するためにramen.showRamen()メソッドを呼び出しています。

図3 ラーメン屋のお客 図3 ラーメン屋のお客(こちらの図はJavaプログラミング[アプリケーション編]ステップアップラーニング』(技術評論社)で使われた図を引用して再作成したものです)
ラーメンを表示
 スープ : とんこつ
実行結果(コンソール出力)

オブジェクトとクラス

 ここで、オブジェクトとクラスの関係について、あらためて見てみましょう。オブジェクトは、「もの」を、あるものの見方に基づいて表現したものです。今回の例では、スープを持つものとしてラーメン・オブジェクトが表現されています。これに対し、オブジェクトを、あるものの見方にもとづいて分類したものがクラスです。今回の例では、とんこつスープを持つものとしてラーメン・クラスが表現されています。

 ここで、「あるものの見方に基づいて」という点に注意が必要です。上記の例では、ラーメンのスープに着目して、ラーメン・クラスが作られていますが、ものの見方が異なれば、ラーメン・クラスも変わってきます。

 例えば、ラーメン屋の売り上げに着目すれば、ラーメン・クラスにはラーメンの価格が含まれるかもしれませんし、そもそもラーメンと餃子は同じクラスとして表現されるかもしれません。

 このように、何に興味を持って“もの”を見るかによってオブジェクトやクラスは変わってきます

 また、オブジェクトはクラスを基に作られます。ラーメン・クラスが「ラーメンの調理方法」とすれば、「その調理方法により作られたラーメン」そのものがラーメン・オブジェクトだと考えることができます。「ラーメンの調理方法」は食べることができませんが、「ラーメンの調理方法」に従ってラーメンを調理すると、実際に食べることができるラーメンができるというわけです。

コラム 「オブジェクトとインスタンスは違うものなの?」

オブジェクトを表す用語として「インスタンス」という用語もよく用いられます。インスタンスは特定のクラスから生成されたオブジェクトを指す場合に用いられます。例えば「ラーメン・オブジェクトは、ラーメン・クラスのインスタンスである」というように使われます。


java.lang.Objectとjava.lang.Class

 ここで、Java言語におけるオブジェクトとクラスについて、もう少し詳しく見ていきます。Java言語にはオブジェクトそのものを表現するクラスであるjava.lang.Objectがあります。

 私たちがJava言語で作成するクラスは、すべてjava.lang.Objectを継承しています。このため、例えば、先ほど作ったラーメン・クラスのインスタンスをjava.lang.Objectとして受け取ることができます。

        // ラーメン料理人にラーメンを注文し、出来上がった
        // ラーメンをjava.lang.Objectで受け取る

        final Object ramen = cook.acceptRamenOrder();

 一方、クラス自体を表現するクラスとしてjava.lang.Classもあります。java.lang.Classを使うと、クラス自体に関するさまざまな情報を取得できます。例えば、ラーメン・オブジェクトのクラス名を表示するためのソースコードは以下のようになります。

        final Class ramenClass = ramen.getClass();
        System.out.println(ramenClass.getName());

 java.lang.Objectから引き継がれているgetClassメソッドを呼び出すことにより、java.lang.Classのインスタンスを取得できます。このインスタンスに対してgetNameメソッドを呼び出すと、このラーメン・クラスのクラス名を取得できます。

 私たちが Javaプログラミングで何げなく利用しているオブジェクトには、実はこのようなメソッドが提供されているのです。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。