先放代码
import java.util.*;
class No{
void thePri(){
System.out.println("NO");
}
}class No1 extends No{
void thePri(){
System.out.println("NO1");
}
}class No2 extends No{
void thePri(){
System.out.println("NO2");
}
}class No3 extends No{
void thePri(){
System.out.println("NO3");
}
}
/*
疑问就在下面的代码中
问题一:去掉default后程序提示错误!这里有我设定3个随机数,分别已经对应了,为什么没有default不能运行?
问题二:当我建立RandomNo对象时,并调用sel()方法,返回值是No,方法里面的switch 语句并没有break语句,比如得到的随机数
        是1,那么就是执行return new No2(),而后面没有break,程序理应当会继续执行接下来的return new No3(),也就是说
        每次调用这个方法时,只会返回new No3(),不会分别返回相应的内容。 
        但是结果不是这样的,而是会自行返回相应的内容?这是为什么???*/
class RandomNo{
private Random rand = new Random();
private int i = rand.nextInt(3);
public No sel(){
switch(i){
default:  
case 0:return new No1();
case 1:return new No2();
case 2:return new No3();
}
}
}public class Demo1{
public static void main(String[] args){
RandomNo del = new RandomNo();
No a = new No();
a = del.sel();
a.thePri();
}
}再看一下代码,和问题二的比较.import java.util.*;/*
这里就可以去掉default,假设i 得到的随机数字是0,就会执行System.out.println("1"),因为后面没有break 
就继续执行System.out.println("2");System.out.println("3");结果就是:
1
2
3
为什么这里遵守switch的原则,而上面则不是??
*/
class RandomPro{
private Random rand = new Random();
private int i = rand.nextInt(3);
public void ret(){
switch(i){
//default:
case 0:System.out.println("1");
case 1:System.out.println("2");
case 2:System.out.println("3");
}
}
}public class Demo2{
public static void main(String[] args){
RandomPro a = new RandomPro();
a.ret();
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xujiaxiang】截止到2008-07-22 09:40:40的历史汇总数据(不包括此帖):
    发帖的总数量:3                        发帖的总分数:50                       每贴平均分数:16                       
    回帖的总数量:54                       得分贴总数量:11                       回帖的得分率:20%                      
    结贴的总数量:3                        结贴的总分数:50                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    public No sel(){
            switch(i){
                default:  
                case 0:return new No1();
                case 1:return new No2();
                case 2:return new No3();
            }
        }
    你的问题是:执行到首先执行default:因为没有break;所以继续往下走
    如果去掉default,因为编译器会考虑i不是0,1,2的情况,但你没有处理,所以不能允许你通过编译。
    改成这样: 
     public No sel() {
            System.out.println(i);
            switch (i) {
                case 0:
                    return new No1();
                case 1:
                    return new No2();
                case 2:
                    return new No3();
                default:
                    return null;//因为你的方法必须返回一个No类型的对象,所以这里需要返回语句。
            }
        }public void ret(){
            switch(i){
                //default:
                case 0:System.out.println("1");
                case 1:System.out.println("2");
                case 2:System.out.println("3");
            }
        }
    这个因为返回类型为void,没有default直接跳出方法就可以了。而上面的方法必须返回一个对象。
      

  3.   

    抱歉,报错不会是switch的问题,是其它的问题!另外像你这样用switch的,千年罕见啊!
      

  4.   

    public No sel() { 
            System.out.println(i); 
            switch (i) { 
                case 0: 
                    return new No1(); 
                case 1: 
                    return new No2(); 
                case 2: 
                    return new No3(); 
                default: 
                    return null;//因为你的方法必须返回一个No类型的对象,所以这里需要返回语句。 
            } 
        } 这里明白了,但是没有break,它应该会继续执行后面的语句啊,那么,每次调用这个方法应该都是 return null?
    为什么不是这样呢??
      

  5.   

    方法都return还有可能去后面执行break吗?
      

  6.   

    原来如此!!!谢谢ZangXT
    又学到东西了
      

  7.   

    去掉default后程序提示错误,是因为编译器检查时发现你的程序不能确保返回No对象,加上default不出错,是因这时default:和case 0:用的是同一条返回语句,这时如果i不是0,1,2的话就会一直返回No1对象.