インスタンス化無しで使える
クラス内の変数やメソッドに「static」を付けるとインスタンス化しなくても利用できるようになります。
プログラムで確認していきましょう。クラスSubの4行目、9行目、11行目にstaticを付けてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package step10; public class Sub { static private int num = 1; public Sub(int num1) { System.out.println("Sub Start"); num = num1; } static public int getNum() { return num; } public void setNum(int num) { this.num = num; } static public void print() { System.out.println("Sub"); } } |
クラスMainのインスタンス化部分を削除し次のように変更してください。
1 2 3 4 5 6 7 8 9 |
package step10; public class Main { public static void main(String[] args) { Sub.print(); System.out.println(Sub.getNum()); } } |
実行してみましょう。
staticを付けることでインスタンス化することなく変数、メソッドが利用できました。
staticの落とし穴
あるクラスをインスタンス化するとインスタンスはメモリに展開されます。複数インスタンス化するとメモリも複数のエリアに展開されます。従って、クラス内に変数Aがある場合は、インスタンス毎にメモリに存在することになり、違った内容を格納できます。
変数やメソッドにstaticを付けるとプログラムを実行した時点でメモリに展開されます。複数インスタンス化してもメモリに展開されません。従ってクラス内のstatic変数Aは複数インスタンス化しても一つしか存在しないことになります。
staticを付けることによりインスタンス化しなくとも利用できるメリットがありますが、動作を把握しておかないと思わぬ不具合を招いてしまいます。staticを付けるのは慎重に行う必要があります。
mainメソッド
次のメソッドはプログラムが開始されると最初に実行されると紹介しました。
1 |
public static void main(String[] args) { |
このメソッドを含むクラス内ではstaticを付けないと基本的にエラーになってしまいます。なぜなら最初に実行されるためどのプログラムからもインスタンス化されません。従って、staticにする必要があるのです。