クラスメソッド

この節の要点

  • メソッド名の前にstaticを付けることでクラスメソッドを定義できる。
  • mainメソッドはクラスメソッドである。

クラスメソッドを定義するためにはメソッドの修飾子にstaticを付けることで定義できます。

ここで、メソッド名と返り値の型、引数の数や型が定義されている1行のことをメソッドシグネチャと呼びます。

たとえば、mainメソッドであれば、図67に示す部分がメソッドシグネチャです。

public static void main(String[] args)
図67:mainメソッドのシグネチャ

mainメソッドのシグネチャを見れば分かるように、Javaにおけるmainメソッドはクラスメソッドです。

シグネチャの見方は図68のとおりです。メソッドを定義する際にはこの順序に則って、記述します。

[アクセス修飾子] [static] 返り値の型 メソッド名(引数の型 引数名 ...)
図68:メソッドのシグネチャの意味

基本的にはCなどの関数の見方とおなじですが、アクセス修飾子とstatic修飾子が新しく導入されています。

mainメソッドをシグネチャに則って読み解くと、

  • 引数は1つ
    • 第1引数として渡されるデータはString型配列で引数argsとして受け取る
  • 返り値はvoid型
    • つまり値を返却しない
  • publicアクセス可能なクラスメソッド
    • publicアクセスの意味については後の章で説明します。

であることがわかります。

以上を踏まえて、クラスメソッドを定義例を図69に示します。ここでは、mainメソッドが定義されているクラスに、同じく定義しました。

public static int addIntegers(int a, int b) {
	int x = a + b;
	return x;
}

public static void main(String[] args) {

	Scanner scan = new Scanner(System.in);
	String input = scan.nextLine();

	String[] nums = input.split(" ");

	int x = Integer.parseInt(nums[0]);
	int y = Integer.parseInt(nums[1]);

	int z = addIntegers(x, y); // addIntegersクラスメソッドの呼び出し
	System.out.println("sum: " + z);
}
図69:足し算をするaddIntegersメソッドの定義と呼び出し

なお、クラスメソッドはクラスメソッドから呼び出せますし、メソッドからも呼び出すことができます。図5の例では、mainクラスメソッドからaddIntegerクラスメソッドを直接呼び出しています。これはaddIntegerメソッドがstatic修飾子を持っているから可能なわけです。

ですが、クラス内に非クラスメソッドとして定義したメソッドを、クラスメソッドのように呼び出すことはできません。

なぜならば、非クラスメソッドは生成されたオブジェクトが持つデータを利用することが前提ですから、クラスを介してクラスメソッドを呼び出している時は呼び出し元のオブジェクトが用意されていないため、呼び出すことができないのです。