初めに
皆さん。こんにちは!
DreamHanksの254cmです。
今回はstaticについて説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第10回 ArrayListです。
static
staticとは?
staticはクラスの構成要素に付与できる修飾子として、メソッドとフィールドに付与することができます。
付与されたフィールドおよびメソッドはプログラムが実行される時、メモリの割り当てを受けて
プログラムが終了されるまで消えずに維持されます。そしてその値はすべてのインスタンスが共有します。
staticフィールド
一般的なフィールドはインスタンスが生成されるたびに新しく生成され、様々な値を持ちますが、
staticが付与されたフィールドはプログラムが実行される時に生成され、すべてのインスタンスが共有します。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Student { public static int studentNum = 20000; public String studentName; } public class ExampleCalss { public static void main(String[] args) { Student harry = new Student(); Student tom = new Student(); Student mugi = new Student(); Student coco = new Student(); System.out.println(harry.studentNum); System.out.println(tom.studentNum); System.out.println(mugi.studentNum); System.out.println(coco.studentNum); } } |
実行結果
1 2 3 4 |
20000 20000 20000 20000 |
上記のサンプルではStudentクラスのインスタンスを生成して各インスタンスのstudentNumの値を出力しています。
各インスタンスのstudentNumに何も代入していませんが、二つ全部20000が出力されました。
つまりすべてのインスタンスはstaticフィールドの値を共有しています。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class ExampleCalss { public static void main(String[] args) { Student harry = new Student(); Student tom = new Student(); Student mugi = new Student(); Student coco = new Student(); System.out.println(harry.studentNum++); System.out.println(tom.studentNum++); System.out.println(mugi.studentNum++); System.out.println(++coco.studentNum); } } |
実行結果
1 2 3 4 |
20000 20001 20002 20004 |
すべてのインスタンスがstaticフィールドを共有しているので、すべてのインスタンスで
行った処理の結果も共有されます。
サンプルを実行結果をみるとStudentのすべてのインスタンスは同じstudentNumを指していることがわかります。
※static変数のメモリは他の変数と異なる領域に格納されます。その領域をmethod領域と呼びます。
staticフィールドはインスタンスと別の時点に生成されるので、インスタンスではなくクラスの名前で参照することができます。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class ExampleCalss { public static void main(String[] args) { Student harry = new Student(); Student tom = new Student(); Student mugi = new Student(); Student coco = new Student(); System.out.println(harry.studentNum++); System.out.println(tom.studentNum++); System.out.println(mugi.studentNum++); System.out.println(++coco.studentNum); System.out.println(Student.studentNum); } } |
実行結果
1 2 3 4 5 |
20000 20001 20002 20004 20004 |
上記のようにインスタンスを使っても、使わなくてもstatic変数を呼び出すことができます。
staticメソッド
static修飾子はクラスの構成要素につけるので、メソッドにもstatic修飾子をつけることができます。
こんなメソッドをstaticメソッドと呼びます。staticメソッドにはstaticフィールドとローカル変数しか使えません。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Student { public static int studentNum = 20000; public String studentName; public static void displayStudentNum() { System.out.println("今のStudentNumは" + studentNum + "です。"); } } public class ExampleCalss { public static void main(String[] args) { Student.displayStudentNum(); Student.studentNum++; Student.displayStudentNum(); } } |
実行結果
1 2 |
今のStudentNumは20000です。 今のStudentNumは20001です。 |
上記のようにインスタンスを生成しなくても、クラスの名前を参照して呼び出すことができます。
staticメソッドで使える変数
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Student { public static int studentNum = 20000; public String studentName; public int grade; public static void displayStudentNum() { int localVariable = 100; grade = 10; System.out.println("今のStudentNumは" + studentNum + "です。"); } } |
staticは先ほどの説明した通り、ローカル変数とstaticフィールドしか使えません。
staticメソッドはインスタンスを生成しなくても使えるメソッドです。
なので、一般のフィールドはインスタンスが生成される時に生成されるので、
staticメソッドでは使えません。
・ローカル変数とは?
括弧「{}」の中で宣言され、宣言された括弧の中でのみ使える変数です。
ローカル変数は宣言された領域が終了されるとなくなる変数です。
終わりに
今回の記事は以上になります。
次回はJavaのfinalを学びましょう。
ご覧いただきありがとうございます。
コメント