mizzsugar’s blog

日々感じていることや学んだことを書きます。エンジニアリング以外にも書くかもしれません。

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

生成した車の数を数える

目標:インスタンスメソッドとクラスメソッドの違いを理解する

インスタンスメソッド、インスタンス変数とは?

インスタンス変数とは、インスタンス固有の変数のことです。 例えば、下記のCarクラスでは、

public class Car {
    private String name;
    private String color;
    private int fuel = 0;
    private int distance = 0;

    public Car(String name, String color) {
        this.name = name;
        this.color = color;
        this.fuel = 100;
    }

    public void getFuel(int fuel) {
        this.fuel += fuel;
    }

    public void run(int distance) {
        this.fuel -= distance;
        this.distance += distance;
    }

}

name, color, fuel, distanceは インスタンスによって異なります。

色とかどれだけ走ったか、どれだけ給油したか、どれだけ走ったかは インスタンスに関連付いていており、 インスタンス固有の変数と言えます。

また、コンストラクタ、getFuel、runも インスタンスに紐づいており、 インスタンスメソッドと言えます。

クラス変数、クラスメソッドとは?

生成した車の数を数えるメソッドを作る際、 上記のメソッドとは異なる点があります。

いくつ車を生成したかは インスタンス固有ではないということです。

クラス全体に紐付いています。

生成した車の数を表す変数を”count”とすると、 変数を宣言する際、以下のように書きます。

//今回はprivate型にしています
//初期値を0としています
private static int count = 0;

このように、インスタンス固有ではなく、 クラス全体に紐づいている変数を宣言する際 staticと指定する必要がります。

staticはインスタンス固有ではなく クラス全体に紐付いてることを示す型です。

このような変数を、クラス変数と言います。

なお、インスタンスを生成するたびにcountが1ずつ増えるよう、 コンストラクタは以下のようになります。

    //Carクラス
    public Car(String name, String color) {
        this.name = name;
        this.color = color;
        this.fuel = 100;
                 count++;
    }

なお、countにはthisが付いていません。 thisはインスタンスを指定するためのものであり、 クラス全体に関連づけられてるstatic変数のcountには使用できないからです。

Carクラスとは別のMainクラスで、countを表示するための メソッドは以下のようになります。

   public static int getCount() {
        return count;
    }

static変数を利用するメソッドには、staticを指定します。 文法は以下のようになります。

アクセス修飾子 static 型 メソッド名(あれば引数){ メソッド }

このような、クラス全体に紐づくメソッドを クラスメソッド と言います。

Mainクラスで、インスタンスを2つ生成し、 生成した数を出力するよう指示するコードは 以下のようになります。

public class Main {
    public static void main(String[] args) {
        Car ferrari = new Car("Ferrari", "red");
        Car benz = new Car("Benz", "silver");
        System.out.println(Car.getCount());
    }
}

Staticメソッドを使用して指示するコードは、 クラス名.メソッド; となります。

上記のMainクラスを実行すると、「2」と出力されます。

おまけ①

インスタンスメソッドのことを「動的メソッド」 クラスメソッドのことを「静的メソッド」 とも呼びます。

変数も同じで、 インスタンス変数を「動的変数」 クラス変数を「静的変数」 とも呼びます。

おまけ②

クラス変数、クラスメソッドは static変数、staticメソッドとも言います。