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
求详解!

解决方案 »

  1.   

    把piggy这个方法的参数名字改了一下。相信楼主已经明白为什么了吧!
    还有个问题楼主没有提到,忍不住还是说了,呵呵!就是为什么打印出来的不是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;
    }
    }
    }
      

  2.   

    楼上正解,在楼主的程序中:
    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
      

  3.   

    补充:
    “vandeleur 0 1 2 3”打印这个结果是在没有修改楼主的方法的参数名的时候,如果将参数名该为与sName不同的任意值后就打出“vandeleur wiggy 0 1 2 3”
      

  4.   

    public void piggy(String sName) {
     sName = sName + " wiggy";
     start();
     }
    java里的变量 如果遇到同名 是离得近的有用(当然是在作用域重叠的地方)