Java入門15 クラスメソッドとインスタンスメソッドの違い

Java入門の第15回です。前回からの続きです。

今回は、インスタンスメソッドについて紹介します。インスタンスメソッドの実例をクラスメソッドと比較することで理解を深めましょう。

インスタンスメソッドの実例

インスタンスメソッドの実例を見てみましょう。

class Point {
    int x;
    int y;

    //インスタンスメソッド
    void printZahyo() {
        System.out.println("x座標は" + this.x + "です");
        System.out.println("y座標は" + this.y + "です");
    }
}

public class Test14 {
    public static void main(String[] args) {
        Point zahyo1 = new Point();
        zahyo1.x = 3;
        zahyo1.y = 5;
        zahyo1.printZahyo();
    }
}

実行結果は、以下の通りです。

x座標は3です
y座標は5です

インスタンスメソッドとクラスメソッドを比較してみる

以下は、上記コードからインスタンスメソッドの部分だけを抜粋したものです。

    //インスタンスメソッド
    void printZahyo() {
        System.out.println("x座標は" + this.x + "です");
        System.out.println("y座標は" + this.y + "です");
    }

クラスメソッドと比較してみましょう。

    //クラスメソッド
    public static void zahyo() {
        System.out.println("x座標は" + x + "です");
        System.out.println("y座標は" + y + "です");
    }

上のコードを比較する限り、違いは2点あるようです。まず、インスタンスメソッドには「public static」がありません。

また、インスタンスメソッドから参照される変数には、this.x や this.y のように「this.」が付いています。

インスタンスメソッドには「static」をつけない

上のコードを比較すると、クラスメソッドには「public static」がありますが、インスタンスメソッドには「public static」がありません。このうちの「public」はインスタンスメソッドにもつける場合がありますが、「static」は インスタンスメソッドにはつけません。

「public」や「static」は修飾子と呼ばれるもので、それぞれに意味があります。static修飾子は、クラスメソッドやクラス変数を宣言するときに使用します。「static」という英単語は日本語に訳すと「静的」という意味ですが、static修飾子が付くということは、それがクラスで共通して利用されるデータであることを表します。

インスタンスメソッドやインスタンス変数は、生成された個別のインスタンスごとに利用されるもので、クラスで共通して利用されるものではありません。一方、クラスメソッドやクラス変数は、クラスで共通して利用される static なものです。

インスタンスメソッドやインスタンス変数には「static」をつけないということを覚えてしまいましょう。もし「static」 が付いていたら、それはインスタンスメソッドやインスタンス変数ではなく、クラスメソッドやクラス変数です。

インスタンスメソッドは「this.変数名」で自分のクラス内の変数を参照できる

上のコードを比較すると、クラスメソッドから変数を参照する場合には「x」や「y」という変数名で参照していますが、インスタンスメソッドから変数を参照する場合には this.x や this.y のように「this.変数名」という書き方になっています。

インスタンスメソッドは「this.変数名」で自分のクラス内の変数を参照できます。例えば、「this.x」と指定すれば「このクラス内の変数x」という意味になります。「this.y」と指定すれば「このクラス内の変数y」という意味です。

一方、クラスメソッドでは「this.変数名」という書き方はできません。もしこのような記述をした場合、Eclipseでは「static コンテキストでは this を使用できません」というエラーメッセージが表示されます。

インスタンスから実行されるメソッドだから「インスタンスメソッド」

もう一度、インスタンスメソッドの実例を見てみましょう。

class Point {
    int x;
    int y;

    //インスタンスメソッド
    void printZahyo() {
        System.out.println("x座標は" + this.x + "です");
        System.out.println("y座標は" + this.y + "です");
    }
}

public class Test14 {
    public static void main(String[] args) {
        Point zahyo1 = new Point();
        zahyo1.x = 3;
        zahyo1.y = 5;
        zahyo1.printZahyo();
    }
}

上記コードでは、Point zahyo1 = new Point(); で、Pointクラスからzahyo1という名前のインスタンスを作成しています。これは、Pointクラスという設計図から、 zahyo1インスタンスという実例を作成したということです。

そして、zahyo1.printZahyo(); で、 zahyo1インスタンス から Pointクラス内のインスタンスメソッド printZahyo() を実行しています。インスタンスから実行されるメソッドだから「インスタンスメソッド」です。

インスタンスメソッドは、そのインスタンス固有の情報をもとに実行される

ここで重要なのは、インスタンスメソッドの実行結果となる座標の情報は、今回生成されたzahyo1インスタンスに固有の情報であるということです。

クラスメソッドの場合には、フィールドの値を「x座標は3、y座標は5 」とクラス内で定義しますが、インスタンスメソッドでは、インスタンス自身が 「自分のx座標は3、自分のy座標は5 」と定義しています。

そのため、今回のサンプルコードで生成した zahyo1インスタンスではx座標は3でy座標は5でしたが、他のインスタンスからインスタンスメソッドを実行した場合には異なる値となるかもしれません。インスタンスメソッドを制御しているのは各インスタンスなのです。

以下は、インスタンスを3つ生成して、それぞれがインスタンスメソッドを実行した例です。

class Point {
    int x;
    int y;

    //インスタンスメソッド
    void printZahyo() {
        System.out.println(this.x + "," + this.y);
    }
}

public class Test15 {
    public static void main(String[] args) {
    	//インスタンスを生成
        Point zahyo1 = new Point();
        zahyo1.x = 3; zahyo1.y = 5;
        zahyo1.printZahyo();

        //インスタンスを生成
        Point zahyo2 = new Point();
        zahyo2.x = 5; zahyo2.y = 7;
        zahyo2.printZahyo();

        //インスタンスを生成
        Point zahyo3 = new Point();
        zahyo3.x = 7; zahyo3.y = 9;
        zahyo3.printZahyo();
    }
}

実行結果は、以下の通りです。

3,5
5,7
7,9

以下は、上記コードをEclipseで実行した結果画面です。

「インスタンスメソッドを制御しているのは、各インスタンス自身である」ということを実感していただければ幸いです。

次回へ続きます。