クラスフィールドとは
クラスフィールドの前に、クラスとは共通の性質を持ったものをまとめたもので、「抽象的」なものでした。そして、インスタンス化する毎に「具体的」なものとして呼び出すことができました。
さて、ここでクラスからインスタンスがいくつ作られたのか、数を数えるにはどうしたらよいのか、考えてみましょう。
まずはフィールドとしてnumberを宣言し、コンストラクタの中でnumberフィールドの初期化を行えば、良いのでしょうか?
class Rectangle{
・・・
int number;
Rectangle(){
・・・
number = number + 1;
}
}
結論から言うと、上記のコードは間違いです。
コンストラクタはインスタンスが新しく作られたときに呼び出されるものです。
呼び出されたときに初めて存在するフィールドになります。
つまり、呼び出される毎に、いつも新しいフィールドなので、何回呼び出しても初期値のままになっています。
インスタンスの中に作られるフィールドは、あくまで個別のインスタンスの情報を保持しているのみで、クラス全体で共通した情報を保持していません。
Javaでは、全インスタンスに共通の情報(クラスの情報)を保持する場所としてクラスフィールドを宣言することができます。
「クラスフィールド」「スタティックフィールド」「クラス変数」などの呼び方は全て同じ意味です。
クラスフィールドの宣言
クラスフィールドを宣言してみましょう。この時のクラス変数counterは、これまでに作成されたインスタンスの個数を保持しておくのに使います。
class Rectangle{
static int counter = 0;
・・・
}
クラスフィールドには、先頭にstaticという修飾子がついています。staticというのは「静的な」という意味になります。
インスタンスフィールドはインスタンスごとに作られるものですが、クラスフィールドはクラスに1つだけ存在します。
では、クラスフィールドを使って、インスタンスの数を数えてみましょう。
class Rectangle{
・・・
static int counter = 0;
int number;
Rectangle(){
・・・
number = counter;
counter++;
}
}
クラスメソッドの宣言
クラスメソッドを宣言する時にも、staticという修飾子をつけて宣言します。
これまでに作られたRectangleインスタンスの個数を調べるメソッドgetCounterを宣言してみます。
class Rectangle{
・・・
static int counter = 0;
int number;
Rectangle(){
・・・
number = counter;
counter++;
}
static int getCounter(){
return counter;
}
・・・
}
staticをつけて宣言したメソッドは、クラスメソッド(staticメソッド)といいます。
staticをつけずに宣言したメソッドを、インスタンスメソッド(staticではないメソッド)といいます。
クラスメソッドはインスタンスに結びついていないので、クラスメソッドの中でthisやsuperを使うとコンパイルエラーになります。
クラスメソッド→クラス内のインスタンスを見つける/クラス変数に対して計算や処理を行う
インスタンスメソッド→インスタンスの状態を調べる/現在のインスタンスに対して計算や処理を行う
mainメソッド
クラスを1つのアプリケーションとして動かすときのmainメソッドは、staticがついているので、クラスメソッドになります。mainメソッドを動かすのにインスタンスは必要ないからです。
mainメソッドは、必ず下記の形式でなければいけません。
public static void main(String[] args){
・・・
}