我有类似以下的内容
TestObjectCreator{
private static Person person;
private static Company company;
static {
person = new Person()
person.setName("Joe");
company = new Company();
company.setName("Apple");
}
public Person createTestPerson(){
return person;
}
public Person createTestCompany(){
return company;
}
}
通过应用静态{}我获得了什么?我认为这些物体是单身人士。但是,如果我做了以下事情:
Person person = TestObjectCreator.createTestPerson();
person.setName("Jill");
Person person2 = TestObjectCreator.createTestPerson();
person2会被命名为Jill还是Joe?
答案 0 :(得分:2)
字段上的static关键字使它们表现为类实例。整个类有一个对象副本,该类的所有实例将共享同一个副本。在将类加载到JVM中时,将调用已创建的静态构造函数。这将设置类的静态字段。在此之后,对于对象的所有实例都会反映对静态字段的任何更改。
在您的示例中,这意味着当TestObjectCreator类加载到JVM中时,将创建此人并将名称设置为“Joe”。然后使用第一个TestObjectCreator.createTestPerson()调用检索此人,并将人员的名称更改为“Jill”。由于TestObjectCreator只有一个人,因此您现在已经在所有情况下更改了人员的姓名。因此,第2人将被命名为“吉尔”。
答案 1 :(得分:0)
我看不到你的setter方法,但是如果你已经正确实现了它,那就是Jill。
目前,您的课程并非完全是单身,因为仍然可以制作您课程的多个实例。为了使你的类单例化,使你的构造函数私有。然后,编写一个TestObjectCreator的静态实例,并通过静态工厂方法返回它。
使Person和Company保持静态的优势在于,TestObjectCreator的所有实例都具有相同的Person和Company副本。我不确定这是否是你想要的,但它是静态提供给你的。