package P;public class P1 extends Thread {
static String sName = "vandeleur"; public static void main(String argv[]) {
P1 t = new P1();
t.piggy(sName);
System.out.println(sName);
} public void piggy(String sName) {
sName = sName + " wiggy";
start();
} public void run() {
for (int i = 0; i < 4; i++) {
sName = sName + " " + i;
}
}
}
运行结果为什么是:vandeleur而不是:vandeleurwiggy
求详解!
static String sName = "vandeleur"; public static void main(String argv[]) {
P1 t = new P1();
t.piggy(sName);
System.out.println(sName);
} public void piggy(String sName) {
sName = sName + " wiggy";
start();
} public void run() {
for (int i = 0; i < 4; i++) {
sName = sName + " " + i;
}
}
}
运行结果为什么是:vandeleur而不是:vandeleurwiggy
求详解!
还有个问题楼主没有提到,忍不住还是说了,呵呵!就是为什么打印出来的不是vandeleur wiggy 0 1 2 3;
在t.piggy(sName);之后sleep一会儿就OK了;
public class P1 extends Thread
{
static String sName = "vandeleur";
public static void main(String argv[])
{
P1 t = new P1();
t.piggy(sName);
// try
// {
// Thread.sleep(1000);
// }
// catch (InterruptedException e)
// {
// e.printStackTrace();
// }
System.out.println(sName);
} public void piggy(String name)
{
sName = name + " wiggy";
start();
}
@Override
public void run()
{
for (int i = 0; i < 4; i++)
{
sName = sName + " " + i;
}
}
}
public void piggy(String sName) {
sName = sName + " wiggy";
start();
}
这个方法中sName在sName = sName + " wiggy";这个语句中前后都被当做是你传进来的参数而非你的成员变量“sName”,这就是未什么楼上这位大侠说要把参数名唤换,你这个语句只是把你传进来的参数的值改变了,而没有改变成员变脸过得值,那为什么加了个...Thread.sleep(1000);...就打出了vandeleur 0 1 2 3了呢,这是因为在你的程序中虽然启动自己的线程在打印语句之前,但是要知道main方法是程序的主线程,当你去启动一个新的线程的时候主线程任然继续运行,而启动一个新的线程的时间远远要比执行System.out.println(sName);
这个语句的时间长,就是说你在打印sName的时候他的值还来不及被你的新线程的方法去改变,因此打出了的是vandeleur ,而加上Thread.sleep(1000)就不一样了,这个语句让主线程睡了1000毫秒(1秒),这个时间完全足够新线程去改变成员变量sName的值,所以最后打出来的是vandeleur 0 1 2 3
“vandeleur 0 1 2 3”打印这个结果是在没有修改楼主的方法的参数名的时候,如果将参数名该为与sName不同的任意值后就打出“vandeleur wiggy 0 1 2 3”
sName = sName + " wiggy";
start();
}
java里的变量 如果遇到同名 是离得近的有用(当然是在作用域重叠的地方)