问题来自http://www.javacertifications.net/javacert/scjp1.6Mock.jsp
问题-20
以下代码的输出是什么?
public class Test extends Thread
{
static String sName = "good";
public static void main(String argv[])
{
Test t = new Test();
t.nameTest(sName);
System.out.println(sName);
}
public void nameTest(String sName)
{
sName = sName + " idea ";
start();
}
public void run()
{
for(int i=0;i < 4; i++)
{
sName = sName + " " + i;
}
}
}
选项
一个好的
B)好主意
C)好主意好主意
正确答案是:A
说明:在使用String的情况下,在本地方法中更改值不会在全局中更改(因为String对象是不可变的)。
最佳答案
没有一个答案是正确的,也没有一个正确的答案。
该问题非常糟糕,因为它混合了两个完全独立的问题:
sName
方法的nameTest()
参数隐藏相同名称的静态变量,并且对局部变量的更改无效。 nameTest()
启动一个线程,该线程在其run()
方法中更改静态变量,而main()
方法将输出变量,而无需等待该线程完成。这被称为竞争条件:巧合的是,将打印变量的哪个状态-可能出现以下任何情况: