クラスでstatic

インスタンス化無しで使える

クラス内の変数やメソッドに「static」を付けるとインスタンス化しなくても利用できるようになります。プログラム例と実行結果を掲載します。

クラスTest10の21行目、25行目、34行目で「static」の記述があります。

これでインスタンス化せずに、6行目、7行目のように利用することができます。

「じゃー全部staticつければいいのでは?」はい。そう感じますよね。でもちょっと問題があります。

staticの落とし穴

このプログラムは、9行目~15行目でクラスTest10のインスタンスを作成しt1,t2の変数に格納しています。そしてstep1メソッドを呼び出すことにより、クラス内変数num1、num2に値を格納し、メソッドprintで表示しています。

実行結果を見ると不思議なことがあります。インスタンスt1のnum2の値が6になっているのです。10行目でnum2に4を設定し、15行目で表示していますが6と表示されています。

この6はt2のnum2と同じ値です。前回、インスタンス毎にメモリが展開されるので格納される値もそれぞれ別になるとの説明がありました。今回はt1,t2の変数num2が同じ値になっているようです。

この原因は変数num2がstaticで定義されているからです。staticで定義するとインスタンス化せずに使えますが、インスタンス化してもインスタンス毎にメモリに展開されません。したがって、インスタンスt1、t2の変数num2は同じ1つのnum2を参照しているのです。

メモリの展開イメージで考えると、プログラムが実行された時点でstaticのモノも展開されます。

クラスがインスタンス化されるとメモリに展開されますが、staticなモノは1つのモノを参照するだけです。

stticを付けることによりインスタンス化せずとも使えますがインスタンス毎に利用できなくなります。そのためstaticの利用は限定的になります。さらに探求する必要がありそうですが、この連載ではここまでとしますね。

タイトルとURLをコピーしました