問題
昔々あるところにStudentクラスというものがあり、そのクラスが持つ静的メンバのscoreという値に0が入っていました。するとそこでMain.javaのクラスからStudentクラスを呼び出し一度インクリメントをしたそうです。次にMain.javaではStudentクラスの初期化を考え、インスタンスにnullを代入し、また新たにインスタンスを作成したようです。さて、下記プログラムの出力はどのようになるでしょう。
プログラム
Studnet.java
public class Student { static int score = 0; public Student() { //特に何もしない } public int getScore(){ return score; } public void setScore(int x){ score = x; } public void incrementScore() { score++; } }
Main.java
public class Main { public static void main(String[] args) { Student st = new Student(); System.out.println("最初の値 :" + st.getScore()); st.incrementScore(); System.out.println("インクリ後の値:" + st.getScore()); /*scoreの初期化?*/ st = null; st = new Student(); System.out.println("null後の値 :" + st.getScore()); } }
回答選択肢
Aさんの回答
最初の値 :0 インクリ後の値:1 null後の値 :1
Bさんの回答
最初の値 :0 インクリ後の値:1 null後の値 :0
答えは↓
答え
答えはAさんの方。このscoreはStudentクラスと1対1に対応しています。例えばC++だと静的メンバ変数が生成されるのはコンパイル時、生成される場所はシステム中のたった1箇所に領域が確保されるだけ。ということで多分Javaでもそんな感じなのでしょう(汗)。通常のメンバ関数と違い1度しか生成されないため、変に値が生き残ることがあるので注意。逆にその性質が使いこなせればとても便利なのだけどね。
ということでもし初期化したいのであれば、このscoreにアクセスして初期化したときのこと(いまだとscore = 0)をもう一度してあげる必要があるのかな。この辺の賢い方法は分からない(;´Д`)。なんだかプログラミングの授業でありそうな話でした。ちゃんちゃん。