6. staticなデータとstaticメソッド
今までは、クラスから生成されたインスタンスが持つ変数やメソッドについて見てきました。これらインスタンスが持つ変数やメソッドは同じクラスをもとにしていても、内部に保持する変数の値やメソッドのふるまいは、インスタンスごとに異なっています。
しかし、Javaではstatic修飾子をつけることにより、変数やメソッドなどをクラスで唯一のものとして扱われるようにすることができます。
6.1. staticな変数
staticな変数(定数も含む)は、クラスからいくつインスタンスが作成されてもメモリ領域に1つのデータしか作成されません。そのため、staticな変数は全インスタンスで同じ値を共有することになります。staticな変数を宣言するには次の書式で記述します。
static データ型 変数名;
例えば、次の例ではDogのstaticな変数であるtypeを「哺乳類」と値を設定しています。そのため全インスタンスからtypeを参照すると「哺乳類」と値を取得することになります。
また、インスタンスを生成するごとにstaticな変数のcountを加算していき、いくつのDogインスタンスを作成したのか知ることができます。このcountがstaticでない場合、インスタンスを生成するたびに0に戻るので、countは1にしかなりません。
また、staticな変数に対し、インスタンスが値を変えた場合、他のインスタンスも同じstaticな変数を参照しているため、その参照している値が変わることになります。
6.2. staticなメソッド
staticなメソッドはインスタンスの状態は関係なく、クラスに定義されている処理を行うメソッドです。staticメソッドは次のように宣言します。
static 戻り値の型 メソッド名( 引数の型 引数名 ) { …… }
staticメソッドはクラスの状態とは関係ない処理を行うため、汎用的に使われる処理などによく使われる傾向があります。
6.3. staticな変数やメソッドへのアクセス
staticな変数やメソッドはインスタンスを生成することなくアクセスできます。staticな変数やメソッドへのアクセスは次のようにします。
クラス名.変数名
クラス名.メソッド名
例えば今までのサンプルで出てきているSystem.out.printlnの「out」は、Systemクラスが持つoutというPrintStreamクラスのインスタンスを持つstaticな変数です。そのoutのクラスであるPrintStreamのメソッドであるprintlnを「System.out.println」では実行しています。
staticな変数やメソッドから、staticでない変数やメソッドへのアクセスはできません。しかし、逆にstaticでない変数やメソッドからstaticな変数やメソッドへのアクセスは可能です。
最後に
今回はJavaの基本的な文法を見てきました。これらをいきなりすべて覚えることは難しいことかと思います。しかし、外国語の習得と同じように、何度も使っていくと、ここで述べた内容が自然と頭に入ってくることかと思います。そのためにはソースコードをたくさん読んだり書いたりすることが大事になります。今回は文法的なことを見せるため余りサンプルのソースコードはありませんでしたが、次からはソースコードを書いていくことになります。その際に忘れてしまったことがあれば、今回の記事を参照していただければと思います。