
これまでのコードは、クラス内のメンバ(フィールドとメソッド)は、オブジェクトが作成されたときに、はじめて値を格納したり呼び出したりすることができました。


オブジェクトを作成することによって、キャラクターの属性や体力量といった値を代入したり、出力したりすることができました。
このことを、フィールドzokusei・tairyokuは
オブジェクトに関連づけられている
ということもあります。
各オブジェクトに関連づけられているフィールドをインスタンス変数、メソッドをインスタンスメソッドといいます。
クラス変数とクラスメソッド
クラスでは、オブジェクトに関連づけられていないメンバを持つことができます。これを、
クラス全体に関連づけられている
ということがあります。関連づけられているフィールドをクラス変数、メソッドをクラスメソッドといいます。
クラス変数・クラスメソッドの、宣言、定義するときにstaticという修飾子をつけることになっています。


クラス変数は0で初期化されています。「キャラクター」オブジェクトが作成されるたびに、「sum++;」が処理され値が増えていくのです。つまり、sumは、
クラス全体で何人のキャラクター(いくつのオブジェクト)が存在しているか
を表すフィールドです。このように、クラス全体で扱うデータを格納しておくフィールドがクラス変数です。
クラスメソッドであるshowSum()メソッドの定義です。

クラスメソッドは、
そのクラスからオブジェクトが作成されていなくても、メソッドを呼び出すことができるのです。
インスタンスメソッドのようにオブジェクトに関連づけられていないので、下記のように呼び出します。
Character.showSum(); //クラス名をつけて呼び出す
sumの値は最初は0ですがオブジェクトが作成された後「sum++;」により、1になっていることが確認できます。
クラスメソッドについての注意
以前クラス内のメンバに「this.」という指定をつけることができることを説明しました。

実は「this.」はインスタンスメソッドの中でのみ使用可能です。
クラスメソッドは特定のオブジェクトに関連づけられていないので、特定のオブジェクト自身を表す「this.」は使用不可となるのです。つまり、下記のようなコードは誤りです。

さらに、クラスメソッド内では、インスタンス変数・インスタンスメソッドにアクセスできません。クラスメソッドは、特定のオブジェクトに関連づけられていないためです。
つまり、下記のようなコードは誤りです。

コンストラクタの定義も、クラスには欠かせない機能です。クラス変数・クラスメソッドの特徴も理解しておきましょう。