>> Java入門トップに戻る
Javaのクラスのstatic修飾子について説明します。
static修飾子は、クラスのメソッドやフィールドに付けて使うもので、これを付けたものは「クラスから直接利用できる」ようになります。
なのでstatic修飾子をつけたメソッドやフィールドは「クラスメソッド」や「クラスフィールド」と呼ばれます。
逆に今までのようにstaticを付けずにインスタンスを生成してアクセスしていたものは、「インスタンスメソッド」「インスタンスフィールド」と呼ばれます。
注意事項として、「クラスメソッドからインスタンスフィールドやインスタンスメソッドにはアクセス不可」であることに注意してください。
「クラスメソッドからは、他のクラスメソッドやクラスフィールドのみにアクセス可能」です。
インスタンスフィールドはインスタンスを生成して初めてアクセス出来るので、インスタンスを生成しなくても利用できるクラスメソッドからアクセスできたら問題ですよね。
ただ、逆にインスタンスからはクラスメソッドやクラスフィールドにはアクセス出来ます。
ですが、これは推奨されていないのか警告が出ることがありますので、インスタンスからはクラスメソッドやクラスフィールドにはアクセスしないほうが良いと思います。
もうひとつの注意事項として、「インスタンスを複数作っても、クラスフィールドはそのクラスでただ1つだけしか存在しない」ことです。
インスタンスフィールドはインスタンス毎に値を保存できましたが、クラスフィールドはインスタンスを複数作っても、生成されたインスタンス間でそのクラスフィールドが共有されて、ただ1つのクラスフィールドにアクセスするようになっています。
ですのでインスタンス間で共有したい値などがある時は使えますね。
では、一度コードを見てみましょう。
注目していただきたいのは10行目と13行目です。
10行目でクラスメソッドechoHelloメソッドを呼び出していますが、インスタンスを生成していません。
「StaticTest.echoHello()」と「クラス名.メソッド名」という形式で呼び出しています。
クラスメソッドを呼び出す場合はこのように書いて呼び出すことができます。
13行目は同じく「クラス名.フィールド名」という形式でクラスフィールドにアクセスしています。
クラスフィールドにアクセスするにはこのように書きます。
さて、おもしろいのは16行目からです。
クラスStaticTestのインスタンスを二つ生成し、20行目で1つ目のインスタンスからクラスフィールド「value」の値を「7777」に書き換えています。
インスタンスからクラスフィールドの値を書き換えるのは止めた方が良いのですが、今回は実験のためあえてこのように書き換えてます。
その後、二つのインスタンスからクラスフィールドの値を出力してますが、どう出力されると思いますか?
そう、クラスフィールドはインスタンス間で共有され、ただ1つしか存在しないので、どちらのインスタンスからアクセスしても同じクラスフィールドを参照する。
つまり、2つとも「7777」と表示されます。
以上が、クラスメソッドとクラスフィールドの説明になります。
インスタンス間で共有したいフィールドがある時や、よく使うメソッドをインスタンスを生成せずに手軽に呼び出したい時などに使うと良いと思います。
ただ使いすぎは良くないので注意です。
>> 【final修飾子】に進む
>> Java入門トップに戻る
static修飾子 クラスフィールド、クラスメソッド
static修飾子は、クラスのメソッドやフィールドに付けて使うもので、これを付けたものは「クラスから直接利用できる」ようになります。
なのでstatic修飾子をつけたメソッドやフィールドは「クラスメソッド」や「クラスフィールド」と呼ばれます。
逆に今までのようにstaticを付けずにインスタンスを生成してアクセスしていたものは、「インスタンスメソッド」「インスタンスフィールド」と呼ばれます。
注意事項として、「クラスメソッドからインスタンスフィールドやインスタンスメソッドにはアクセス不可」であることに注意してください。
「クラスメソッドからは、他のクラスメソッドやクラスフィールドのみにアクセス可能」です。
インスタンスフィールドはインスタンスを生成して初めてアクセス出来るので、インスタンスを生成しなくても利用できるクラスメソッドからアクセスできたら問題ですよね。
ただ、逆にインスタンスからはクラスメソッドやクラスフィールドにはアクセス出来ます。
ですが、これは推奨されていないのか警告が出ることがありますので、インスタンスからはクラスメソッドやクラスフィールドにはアクセスしないほうが良いと思います。
もうひとつの注意事項として、「インスタンスを複数作っても、クラスフィールドはそのクラスでただ1つだけしか存在しない」ことです。
インスタンスフィールドはインスタンス毎に値を保存できましたが、クラスフィールドはインスタンスを複数作っても、生成されたインスタンス間でそのクラスフィールドが共有されて、ただ1つのクラスフィールドにアクセスするようになっています。
ですのでインスタンス間で共有したい値などがある時は使えますね。
では、一度コードを見てみましょう。
package test4; public class StaticTest { //クラスフィールド public static int value=1000; public static void main(String[] args) { //クラス名.メソッド名でアクセス可能 StaticTest.echoHello(); //クラス名.フィールド名でアクセス可能 System.out.println(StaticTest.value); //インスタンスを2つ生成 StaticTest obj = new StaticTest(); StaticTest obj2 = new StaticTest(); //1つ目のインスタンスからクラスフィールドの値を変更 obj.value=7777; //出力して確認 System.out.println(obj.value); System.out.println(obj2.value); } //クラスメソッド public static void echoHello(){ System.out.println("Hello"); } }コメントで書いてあるようにstaticをつけたクラスフィールド「value」とクラスメソッド「echoHello」を定義しています。
注目していただきたいのは10行目と13行目です。
10行目でクラスメソッドechoHelloメソッドを呼び出していますが、インスタンスを生成していません。
「StaticTest.echoHello()」と「クラス名.メソッド名」という形式で呼び出しています。
クラスメソッドを呼び出す場合はこのように書いて呼び出すことができます。
13行目は同じく「クラス名.フィールド名」という形式でクラスフィールドにアクセスしています。
クラスフィールドにアクセスするにはこのように書きます。
さて、おもしろいのは16行目からです。
クラスStaticTestのインスタンスを二つ生成し、20行目で1つ目のインスタンスからクラスフィールド「value」の値を「7777」に書き換えています。
インスタンスからクラスフィールドの値を書き換えるのは止めた方が良いのですが、今回は実験のためあえてこのように書き換えてます。
その後、二つのインスタンスからクラスフィールドの値を出力してますが、どう出力されると思いますか?
そう、クラスフィールドはインスタンス間で共有され、ただ1つしか存在しないので、どちらのインスタンスからアクセスしても同じクラスフィールドを参照する。
つまり、2つとも「7777」と表示されます。
以上が、クラスメソッドとクラスフィールドの説明になります。
インスタンス間で共有したいフィールドがある時や、よく使うメソッドをインスタンスを生成せずに手軽に呼び出したい時などに使うと良いと思います。
ただ使いすぎは良くないので注意です。
>> 【final修飾子】に進む
>> Java入門トップに戻る