static!! | のんびりした人の日記

のんびりした人の日記

仕事の愚痴とアニメ関連のことを書いていきます。

今回のネタはstatic修飾子についてです。
これは以前やったpublicやprivateみたいに以前の自分にとってはちんぷんかんぷんだったものです。
それが独習C#のおかげでどうにか理解できるようになりました。
けど、結構約束事が多いですね。覚えるのは大変そうですが理屈からいけば覚えるというより感覚でわかるようになると思います。それをまずは目指したいと思います。


では、まずstaticがついている変数やメソッドはどのような働きをするのかについてです。
staticがついている変数やメソッドは、そのクラスのインスタンスごとではなくクラスごとにデータを持ちまたはデータを処理します。今までだと、クラスという名の設計図をもとにしてインスタンスという実体を作りだし、インスタンスという実体にはそれぞれにステータス(変数だと思ってください)と機能(メソッドと思ってください)を持っていたわけです。しかし、なにかの部品の生産現場を想像してみてください。部品(インスタンス)を作るときには「今、この設計図のものを何個作ったか」という情報も必要になると思います。その「何個作ったか」という情報は個々の設計図(クラス)ごとに持つ情報ですよね。そのような情報についてはstaticをつけるという感じでしょうか。・・・・けど、家電とかロット番号があるから例としてはだめかなww


先ほどの説明では、「変数について」という感じが強く出てしまっていますが、最初に説明してた通りメソッドにもstaticをつけることもあります。

そして、このstaticをつけた変数やメソッドの約束事
①staticの付いている変数やメソッドに対してアクセスするときには必ずクラス名を使ってアクセスする。
②静的メソッドにはthisを使ってアクセスすることはできない
③静的メソッドが直接呼び出せるメソッドは、他の静的メソッドだけである
④静的メソッドは、静的な変数にのみアクセスすることができる。

①~④で共通することは「staticなメンバーはstaticなメンバーに対してのみアクセスすることができる」という感じでしょうか。あと、アクセスもクラス名を必ず使うということは忘れてはいけませんね。
先ほどの説明がある程度想像できるならば、この約束事もなんとなくわかる気がする感じがする・・・・・かな。僕は結構わかる気がするのですが。


そして、staticは変数やメソッドだけではなく、コンストラクタやクラスにもつけることができるのです。・・・・あぁ、先ほどの説明がww
staticをコンストラクタにつけた時にはそれは静的コンストラクタと呼ばれ、静的コンストラクタは、特にクラス全体の初期化を目的に用いられます。通常のコンストラクタというのは、そのクラスのインスタンスを生成する際にクラスメンバを初期化するために使われますが、やはりstaticはインスタンスとは絶縁関係にあるのでしょうかねww
また、この静的コンストラクタはそのクラスがコンパイルの時にロードされたときに働くものなので、インスタンスの生成に先立ってクラスの初期化がされます。
制限としましては、静的変数や静的メソッドと同じような感じですね。
①静的コンストラクタにはアクセス修飾子をつけることはできない
②①を受けて、プログラムの他の場所からはアクセスできない(アクセス修飾子を付けれないということはprivateがつけられている状態と同じなので)
③静的コンストラクタを実行する際には、静的なメンバにしかアクセスできない(静的メソッドと同じですね)


そして、クラスにstaticを付けた場合にはそれは静的クラスと呼ばれ、それには以下の2つの特徴があるといわれています。
①静的クラスからはインスタンスを生成することができない。
②静的クラスの中には、静的なメンバしか定義することができない
いずれも、静的な変数、メソッド、コンストラクタの共通の要素を持っているという感じでしょうか。




印象に強く残るのは「staticなメンバにはstaticなメンバを」というイメージでしょうかね。これをまず頭の中に置いておきたいと思います。

では、今回は非常に長くなりましたがこの辺で。