staticをざっくり一言でいうと
変数やメソッドを共用できる魔法の修飾子!
※通常はインスタンス化が必要。
10/9追記
メソッドやフィールドの呼称についてコメントで教えてくださいました!
-
staticで修飾なし → インスタンス〇〇
※staticで修飾されていないものはインスタンス化しないと利用できないからですね。 -
staticで修飾あり → クラス〇〇
詳細についてはコメントをご確認ください!
表付きで教えてくださってますので!
staticにできるもの
- 変数
- メソッド
変数やメソッドをクラス間で共用や上書きができると便利なときもありますよね。
しかし、不意な変更をしてしまう可能性もあるので注意しましょう。
ざっくり説明
まず、通常の変数やメソッドの場合、クラス間で共用するには
- クラス内で変数やメソッドを定義。もしくはメソッド内で変数を定義。
- 使用したい変数やメソッドが記載してあるクラスのインスタンスを生成
- インスタンス経由て変数やメソッドにアクセスする
このような手順となります。
しかし、staticの場合はこれが簡略化されます。
- クラス内で変数やメソッドをstaticを付けて定義。もしくは、メソッド内で変数をstaticを付けて定義。
- そのまま変数やメソッドを利用できる!
説明
なぜインスタンスを作らなくても使用できるのかについて見ていきましょう。
プログラムの動き
Aクラス(メイン)とBクラス、Cクラスを使用するプログラムを例に考えます。
それぞれのクラスの記載内容は以下となります。
-
Aクラス
- メインメソッド
- Bクラスのインスタンス生成
- Bクラスの変数とメソッドを使用(このとき、上で作ったBクラスのインスタンスを使用している)
- Cクラスのstatic変数とstaticメソッドを使用
-
Bクラス
- 変数とメソッドの定義
-
Cクラス
- static変数とstaticメソッドの定義
このプログラムがコンパイル、実行されたときの動きは下記のようになります。
- 各クラスが読み込まれる
- Aクラス実行
- Aクラスの記載順に、まずはBクラスのインスタンスが生成される
- Aクラスに記載されているBクラスの変数やメソッドから、処理がBクラスに移る
- Bクラスの該当箇所の内容が上から順に読み込まれ、実行される。処理が終わったら、Aクラスに戻る
- Aクラスに記載されているCクラスの変数やメソッドから、処理がCクラスに移る
- Cクラスの該当箇所の内容が上から順に読み込まれ、実行される。処理が終わったら、Aクラスに戻る
- 全ての読み込みが完了し、プログラムが終了する
注目していただきたいのは、Bクラスの変数やメソッドと、Cクラスのstaticな変数やメソッドは、メモリ空間上の別の場所に配置されているということです。
手順1「各クラスが読み込まれる」ときに、staticな変数やメソッドは専用のstatic領域に配置されます。
一方、通常の変数やメソッドは、メモリ空間の各インスタンス内に個別に配置されます。
そのため、通常の変数やメソッドは
- インスタンスを生成し、生成したインスタンス経由で使用する
- 各インスタンス内で個別に作られるため、同名であっても異なる値を持つ
というわけなんですね。
そしてstaticな変数やメソッドの場合は
- メモリ空間上の専用領域に配置される
- インスタンス内にあるわけではないので、インスタンスを生成する必要がない
- 専用空間に配置されるので、同名のstaticなものを複数定義できない
- 参照先が一つなので、どのクラスからアクセスしても同一の値を返す
となるわけです。
staticの真意
冒頭でお伝えした、『staticとは変数やメソッドを共用できる魔法の修飾子!』というのは半分当たっていて、半分外れています。
プログラムを動かしたときに、複数のクラスから呼び出されるstatic変数やstaticメソッドが、呼び出す度に値や実行内容が変わってしまっては大変ですよね。
実は、static(意味:静的な、不活の、動きのない)の真意は、『参照先が一つなので、どのクラスからアクセスしても同一の値を返す = 変わらないものを定義する時に利用する』です。
例えばファイルパスや変更予定のない変数(定数)、内容が変わってしまっては困るメソッドなどへの使用が主となります。
staticの注意点
staticメソッドから、通常の変数やメソッドへアクセスすることはできません!
staticからはstaticなものへのみ、アクセスできます。
まとめ
staticとは不変に保ちたい(クラス)変数や(クラス)メソッドにつける修飾子であり、staticな(クラス)変数や(クラス)メソッドは、インスタンスを生成しなくても使用することができます。
後書き
私自身、Javaを勉強している途中ですので、記事内の表現について誤った部分のある可能性があります。
概略は間違っていないと思いますので、初心者の方の理解促進の一助となっていれば幸いです。
また、冒頭と終わりで真逆に近いような内容を伝えていることについては、ヒングロマクソン族でいうマダオみたいな感じで受け取っていただければと……。