静态值是根据Java中类的个数?

Static values are based on the number of classes in Java?

我对java很生疏,想在youtube教程里重新学一遍,代码如下:这是Person.java

package com.gurmeet.javacourse.lesson2;

import com.gurmeet.javacourse.lesson3.Name;

public class Person {

private Name personName;
private static int personCounter;

public Person()
{
    personCounter++;
    /*
     * empty on purpose - default constructor
     */
}

public Person(Name personName) {
    this.personName = personName;
}

public String helloWorld() {
    // TODO Auto-generated method stub
    return "Hello World";
}

public String hello(String name) {
    // TODO Auto-generated method stub
    return "Hello " + name;
}

public static int numberOfPersons() {
    // TODO Auto-generated method stub
    return personCounter;
}

}

这是PersonTest.java

package com.gurmeet.javacourse.lesson2;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class PersonTest {

@Test
public void shouldReturnHelloWorld() {
    
    
    Person marcus = new Person();   
    assertEquals("Hello World", marcus.helloWorld());
}

@Test
public void shouldReturnHelloMarcus() {
    Person person = new Person();
    assertEquals("Hello Marcus", person.hello("Marcus"));

}

@Test
public void shouldReturnNumberOfPersons() {
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = new Person();
    Person person4 = new Person();

    assertEquals(4, Person.numberOfPersons() - 1);

}

}

上面这两个在同一个包中,但我在同一个项目中创建了另一个包,如下所示:

package com.gurmeet.javacourse.lesson3;

public class Name {

}

我正在使用 JUnit 来测试我的代码,但是在我的代码的最后一次测试中,我一直出错,你看到人数应该是 4,但结果一直显示 5。 youtube 的家伙得到了正确的答案,即使我正确地遵循了他的编码,我也没有。我在教程中了解到,静态是全局的,处于 class 级别,并且由于我在同一个包中创建了两个 classes,personCounter 默认情况下不是 1,而是 2 ,因此它一直显示 5 而不是 4。我通过在方法中减去 1 来解决它,但我认为这不是正确的方法。我的推理正确吗?还是有其他解释。最重要的是,我该如何解决这个问题?如果我有任何错误,请宽待我。

我想主要问题是,当您 运行 前两个测试时,静态变量 personCounter 变为 2,因为您正在创建两个对象。然后当你 运行 第三次测试时,它从 3 开始到 6。

我想如果您添加另一个方法来将人员计数器设置为零并在第三个测试中创建对象之前调用此方法,您将得到 4 作为输出。

将此添加到您 class 作为函数

public static void setNumberOfPersons(int value) { personCounter = value; }

然后第三次测试先调用Person.setNumberOfPersons(0);

编辑:

感谢 seelenvirtuose(见评论)指出测试的随机顺序部分。如前所述,我想通过在第三次测试中将值设置为 0 可以解决问题。这样顺序就无所谓了。