1、public class test2 {
public static void main(String[] args)
{
int i = 9;
switch(i){
default:
System.out.println("default");
case 0:
System.out.println("zero");break;
case 1:
System.out.println("one");
case 2:
System.out.println("two");
}
}
}
为什么输出结果是:default
                  zero
2public class Tux extends Thread{
static String sName = "vandeleur";
public static void main(String[] args)
{
Tux t = new Tux();
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,是怎样运行出来的?

解决方案 »

  1.   

    switch运行过程:
    通过switch的条件选择case情况,如果没有就执行default,在没有break的情况下忽略case条件选择,将每个case后的语句都执行
    String是final的,每次对string的更改都是创建一个新的string的对象~原始String无法改变
      

  2.   

    1.switch里面是顺序执行的,9先和defalut匹配,然后由于缺少break,而继续往下执行,所以就输出了zero,碰到break,就退出。不过,default写在最后面。上面的情况,就属于case穿透。
    2.String是final的,每次对string的更改都是创建一个新的string的对象~原始String无法改变
      

  3.   

    第一问是case语法,每个case都应该有break,否则会一直匹配第二问是java基础,java是传引用的拷贝,string是特殊对象,string的拼接会新生成对象实例,原来的引用已丢失,所以在java方法里不要将string作为引用传递
      

  4.   

    1.由于switch语句中首选执行default语句,符合条件,输出default,又由于缺少break语句,程序忽略case条件,继续执行输出语句,所以是上述结果!
    2.String是final的,每次对String 的更改是新建一个新的String对象,而原来的String不变
      

  5.   

    而且,在打印输出sName的时候,另一个线程可能还没有运行到for循环
      

  6.   

    public class Tux extends Thread{
        static String sName = "vandeleur";
        public static void main(String[] args)throws Exception
        {
            Tux t = new Tux();
            t.piggy(sName);
            Thread.sleep(300);
            System.out.println(sName);
        }
        public void piggy(String sName){
            Tux.sName = sName + "wiggy";
            start();
        }
        public void run(){        for(int i = 0 ;i < 4 ; i++)
            {
                sName = sName + " " + i;
            }
        }
    }这样就对了
      

  7.   

    改得不错。这道题本身出得有问题,不见得每次运行都能得到题目声称的【输出结果是vandeleur】,这要看main线程和new出来的那个线程哪个快。比方说,上面8楼的修改有意让main线程睡了会,打印的就会是new出来的线程修改过的值。就算不sleep,也很难说main线程总是会快一点。题目本意考察的是语句
    sName = sName + "wiggy";
    中sName都是参数变量,没有对sName成员变量进行过修改。
      

  8.   

    【输出结果是vandeleur】但有时怎么是vandeleur 0 1 2 3期待高手
      

  9.   

    1.switch依次执行,到break或者i=9时跳出
    2.传值。。
      

  10.   

    switch就是开关,一旦有条件满足就开始执行。而它中的default块和case块是并列的,满足了default这个条件,就把开关打开然后开始执行了switch里的所有代码块了  除非遇到break可以跳出该循环, sName = sName + "wiggy";
    这句话会先把"vandeleur"这个对象取出,然后连接上"wiggy",组成新的对象,然后再赋给sName,这里的sName都是局部变量 不是属性……而输出的是属性  它的仍然是"vandeleur"对象的引用  没有改变
      

  11.   

    你真的看到了vandeleur 0 1 2 3输出?我试运行了好多次,都没能看到这种输出。
    为什么会输出vandeleur 0 1 2 3,我在10楼有说过。
      

  12.   

    这些问题最好找本java的基础书好好看看一下。
      

  13.   

    Final个锤子 t.piggy(sName)里面没有写
    this.
    所以是废的而start()把改值函数传入了了新的线程    对返回值没有影响    看下例class Misc extends Thread
    {
    static String str="WOLEGECAO";
    public void run()
    {this.str=this.str+" "+1;}
    public static void main(String[] args) 
    {
    Misc misc=new Misc();
    misc.run();
    System.out.println(str);
    }
    }这个返回
    WOLEGECAO 1class Misc extends Thread
    {
    static String str="WOLEGECAO";
    public void run()
    {this.str=this.str+" "+1;}
    public static void main(String[] args) 
    {
    Misc misc=new Misc();
    misc.start();
    System.out.println(str);
    }
    }这个返回
    WOLEGECAO不知道你们是怎么学的  String就是Final了?搞笑
      

  14.   

    lz的问题考的是局部变量覆盖全局,那句sName = sName + "wiggy";根本没有对全局的静态变量产生影响,上面大家也都说了,你认为就你一个知道么?
    在说别人之前先看下你自己,你也无法保证println执行时misc线程还没结束,上面也有人出现了子线程先结束的情况,一棍子打死也是不对的
      

  15.   


    JAVA 里面有传引用的吗?  只能理解成那个样子 但是不是传的引用
      大家可以看看这个  String i = '111';
      String w = "222";
     public void chage(String i, String w){
      String inde = i;
      String i = w;
      String w = inde;
    }如果是引用的话 
          会把两个值 换过来
        但是运行下 各自的字符串都没有变 这个我觉得是这样的 我们把每个对象在栈内的 地址传入(就是数值)过去了 我们每次改变的是 对字符串操作从而生成了新的字符串。得到在栈里面新的空间 而不是改变以前的。。 所以 所以传入进来String 对象是没有改变的
      
      

  16.   

    不好意思 引用错了
    JAVA 里面有传引用的吗? 只能理解成那个样子 但是不是传的引用
      大家可以看看这个  String i = '111';
      String w = "222";
     public void chage(String i, String w){
      String inde = i;
      String i = w;
      String w = inde;
    }如果是引用的话 
      会把两个值 换过来
      但是运行下 各自的字符串都没有变 这个我觉得是这样的 我们把每个对象在栈内的 地址传入(就是数值)过去了 我们每次改变的是 对字符串操作从而生成了新的字符串。得到在栈里面新的空间 而不是改变以前的。。 所以 所以传入进来String 对象是没有改变的