The jonki

呼ばれて飛び出てじょじょじょじょーんき

nullと初期化と静的(static)メンバについて

問題

昔々あるところに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)をもう一度してあげる必要があるのかな。この辺の賢い方法は分からない(;´Д`)。なんだかプログラミングの授業でありそうな話でした。ちゃんちゃん。