【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メソッドとも言います。