0

インスタンス変数を静的にすることについて、このようなJavaの問題に遭遇しました。

public class Student {
 private static String name;

 public Student(String name) {
    this.name = name;
 }

 public String getName() {
  return name;
 }  
}

とテスト:

public void testBadStatic() {
  Student studentA = new Student("a");
  assertEquals("a", studentA.getName());
  Student studentB = new Student("b");
  assertEquals("b", studentB.getName());
  assertEquals("a", studentA.getName());

name変数は静的であるため、2番目のassertEqualsは失敗すると思います。そのため、すでに「a」が割り当てられています。ただし、正しい出力は、2番目のアサーションではtrue、最後のアサーションではfalseである必要があります。誰かが私がこれを理解するのを手伝ってもらえますか?

ありがとう。

4

6 に答える 6

3

finalstatic変数の間で混乱していると思います。

最終(静的ではない)変数はインスタンスに関連付けられており、コンストラクターで、または静的初期化を通じて値を取得できます。

静的変数はクラスに関連付けられているため、特定のクラスのすべてのインスタンスについて、1つのJVMインスタンス間で同じ値を共有します。

最終的な静的変数は、2つの中で最も制限されたものを提供します。これは、定数として有効です。変更することはできず、特定のクラスのすべてのインスタンスで同じです。

結論:

this.name = name;

ステートメントは、個々のインスタンスではなく、クラスに関連付けられている値を更新するため、そのような呼び出しの後、各インスタンスは同じ値(最後の代入操作の結果)を「参照」します。

于 2012-11-28T13:11:58.763 に答える
2

次の行があるため、2番目のアサートは失敗しません。

Student studentB = new Student("b");

すべてのインスタンスのname変数を変更します。

したがって、2番目のアサートが発生すると、Student.name "b"です。(これはStudent私がここで参照しているクラスであることに注意してください)。

3番目のアサーションは実際に失敗します。これはname、すべてのインスタンス(studentAstudentB現在の両方)がであるため"b"です。

言い換えると:

Student studentA = new Student("a");
  // studentA.name = "a"
assertEquals("a", studentA.getName());    // This passes
Student studentB = new Student("b");
  // studentB.name = "b"
  // studentA.name = "b"
assertEquals("b", studentB.getName());    // This passes
assertEquals("a", studentA.getName());    // This fails
于 2012-11-28T13:11:03.447 に答える
2

public Student(String name){

これはコンストラクターです。このクラスのインスタンスを作成するたびに、この「メソッド」が呼び出されます。ただし、静的変数はクラスに属します。したがって、静的文字列名を値に設定すると、既存のすべてのインスタンスの名前が変更されます。

于 2012-11-28T13:11:35.687 に答える
0

試す :

public class Student {
    private static String name;

    public Student(String name) {
        Studen.name = name;
    }

    public String getName() {
        return Student.name;
    }  
}
于 2012-11-28T13:09:22.410 に答える
0

静的変数は「変更されない」という意味で「静的」ではありません。つまり、すべてのインスタンスが同じ変数を共有するため、2番目のコンストラクター呼び出しで静的変数の値が「b」に置き換えられました。

于 2012-11-28T13:11:30.730 に答える
0

2番目のアサーションは、コンストラクターの静的変数に「b」を割り当てます。これが、3番目のアサーションが失敗する理由でもあります(「a」が予期され、「b」が見つかりました)。

于 2012-11-28T13:14:02.150 に答える