2010-05-17 25 views
2

我有类似如下的静态变量测试oObject创造者

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

我相信“Person person = TestObjectCreator.createTestPerson();”会导致编译器错误,因为该方法未声明为静态,并且您没有TestObjectCreator的实例。 – DJClayworth 2010-05-17 20:49:56

+0

不正确。静态块在静态方法之前执行 – 2010-05-17 23:54:43

+0

不,编译器错误。 createTestPerson()是一个实例方法。 – DJClayworth 2010-05-18 13:32:42

回答

2

字段上的静态关键字导致它们表现为类实例。整个类有一个对象副本,并且该类的所有实例将共享同一个对象。当类被加载到JVM中时,您创建的静态构造函数将被调用。这设置了类的静态字段。在此之后,对该对象的所有实例反映对静态字段的任何更改。

在你的例子中,这意味着当TestObjectCreator类被加载到JVM中时,该人被创建并且名字被设置为“Joe”。然后,您使用第一个TestObjectCreator.createTestPerson()调用来检索此人,并将该人员的姓名更改为“Jill”。由于TestObjectCreator只有一个人,所以你现在已经在所有情况下改变了这个人的名字。所以,人2将被命名为“Jill”。

+0

谢谢,那就是我一直在寻找的!我会尽我所能给你答案。 – stevebot 2010-05-17 19:15:50

+0

没问题! static关键字是Java中更令人困惑的一点。我真的很高兴我可以帮你清除它。 – Zoe 2010-05-17 19:19:56

0

我看不到你的setter方法,但它会是Jill,以防你正确实现它。

目前你的类并不是完全单一的,因为它仍然可以创建你的类的几个实例。为了让你的类单身,让你的构造函数是私人的。然后,编写一个TestObjectCreator的静态实例并通过静态工厂方法返回它。

使Person和Company静态化的好处在于,TestObjectCreator的所有实例都具有Person和Company的相同副本。我不确定这是否是你想要的,但它是静态提供给你的。