プログラムを書くときに使う変数はざっくりとインスタンス変数とクラス変数に分かれるらしい。
安易なネーミングではあるが、インスタンス変数はクラスから作ったインスタンスにくっ付いているのでインスタンスが異なれば違う内容になるが、クラス変数はクラスにベッタリな変数で同じクラスならどのインスタンスでも同じ内容になるので、判りやすいネーミングである。
しかし、これで雰囲気をつかむと厄介なことが起こる。
(インスタンスに似ている)インヘリタンス(継承関係)にあるクラスのクラス変数だ。親のクラスでAを1としても派生したクラスでAを2にすれば、いつまでも親のクラスのAは1で派生したクラスのAは2とインスタンス変数の様な振る舞いをする。いやいや、それぞれのクラスにベッタリな変数だからクラス変数じゃないか!やっぱりしっくりくるネーミングだと思うかもしれない。しかし親のクラスのみに宣言されているBについては派生したクラスのBは親のクラスのBを参照することになり全面的にクラスにベッタリな変数ではないのだ。だから、うっかり派生したクラスでAを宣言しわすれた場合も親のクラスのAも2になってしまうのだ。それは「うっかりした奴が悪いダケ」と思うかもしれないが、自分がうっかりしたら「仕様が悪い」と怒り出す奴の思考形態でしかないのだ。現実で「知らない他人が後付けした派生したクラスがクラス変数Aを2と変更していた」場合はまず気が付かないので、public static final String などと書かないと安心できない。
- たった一種類のクラスとたくさんのインスタンス(あるいはオブジェクト)。
- たった一種類の親クラスとたくさんのインスタンスされたクラス。
現実のコードは、上記2行の組み合わせで出来ているので、非常に煩雑だ。
だから、インスタンス変数とクラス変数なんてことは、たった1つのインスタンスされたクラスの中の記述の事柄でしかなく、これによってどんな違いが起きるのかは予想できない。
無用な混乱を避けるため、インヘリタンス(継承)するクラスではクラス変数を宣言しなかったり親クラスと同じ変数名を使わないようにすると思うが、そんなことは一切キニシナイ人間は相当数居るよう(ソースの中にstatic int MAX=10などと・・・)で、1行でも短くしたいWEB上のサンプルのソースコーソを除けば、クラス変数専用のクラスを作ることが多い様だ。
この様に、とりあえずイメージをつかんでもらうには便利なインスタンス変数とクラス変数も、クラスの変数の色々な宣言の仕方を使い込んでくるとインヘリタンス(継承)の仕組みのごく一面を表現したジャーゴン( 仲間うちにだけ通じる特殊用語。 専門用語。)であることに気が付くだろう。
インヘリタンスを使い込むには、画面系のエディタを作るのが一番。ちょっとでも指定を誤れば画面に変な動きとしてミスにすぐ気が付くからだ。しかもお手軽にブラウザ上でJavaScriptのIDEIDE(開発環境)を使うよりも、Eclipseの様なを使う方がデバッグはしやすかったりする。
うまくいったら、ついでにUNDOやREDOも実装してみよう。2~3種類の機能を作り込むだけで、ガンガンとググってコピペしてコードをスクラッチするだけでは解決できないことがあるのだと気が付くはずだから。(笑
それにしても堅実的なソースコードは、うっかりミスなどの被害に堅牢に作ってある。それだけトラブルが絶えないという現実の傍証なのである。