class RandomShapeGenerator
{
private Random rand = new Random(47);
public Shape next()
{
switch(rand.nextInt(3))
{
default:
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();

}
}
}// Shape是基类,Circle,Square,Triangle是导出类
// 测试多态今天无意中注意到这个default,因为一直习惯是放在最下面,问一下这里为什么一定要放在最上面才行。

解决方案 »

  1.   

    可以的,这个是代码的风格问题。
    正常的逻辑是
    判断可能先出现的所有条件 是否符合后才去做default操作。这样当别人看到你的代码 ,给人一种清晰感
      

  2.   

    default在switch语句里,是可以随便放的。都可以执行,不会报错的。只是个人习惯而已。
      

  3.   

    都可以吧,如果你想研究,可以查查jvm的处理
      

  4.   

      如果你放在最下面的话会产生编译错误的 
      因为  :
          假设 你的有个值是switch 里 运行defalut模块    没有返回语句 就会报错啊 。。 你可以 defalut :break;  不就随便那个地方就可以了
      

  5.   

    你们的回答都是错误的!!如果再这个程序里随便放哪都行,我还问吗?为了让你们看清楚,把所有代码都帖出来:
    package duotai.linpan;
    import java.util.*;class Shape
    {
    public void draw()
    {
    }
    public void erase()
    {
    }
    }class Circle extends Shape
    {
    public void draw()
    {
    System.out.println("Circle.draw()");
    }
    public void erase()
    {
    System.out.println("Circle.erase()");
    }
    }class Square extends Shape
    {
    public void draw()
    {
    System.out.println("Square.draw()");
    }
    public void erase()
    {
    System.out.println("Square.erase()");
    }
    }class Triangle extends Shape
    {
    public void draw()
    {
    System.out.println("Triangle.draw()");
    }
    public void erase()
    {
    System.out.println("Triangle.erase()");
    }
    }// 一种工厂
    class RandomShapeGenerator
    {
    private Random rand = new Random(47);
    public Shape next()
    {
    switch(rand.nextInt(3))
    {
    default:
    case 0: return new Circle();
    case 1: return new Square();
    case 2: return new Triangle();
    }
    }
    }public class Shapes
    {
    private static RandomShapeGenerator gen = new RandomShapeGenerator();
    public static void main(String[] args)
    {
    Shape[] a = new Shape[9];

    for( int i = 0; i < a.length; i++)
    a[i] = gen.next();

    for( Shape shp : a)
    shp.draw();
    }
    }
      

  6.   

    补充说明:
    把default:break;放在最后在这个程序里编译会报错!
    注释掉default也会报错。
      

  7.   

    你要有返回值亚
    如果这
    case 0: return new Circle(); 
    case 1: return new Square(); 
    case 2: return new Triangle(); 
    不符合switch的话,编译会让你通过马???
    有了default:那就好了,肯定有返回值了
    我的意思不知道你懂了吗?
      

  8.   

    10楼的,终于看到有个人懂了,哈哈
    因为我试过default: break;放在最后是错误的,但是我写default: return new Circle();就没问题了我想知道的是放在第一句default:为什么就对了?后面为什么不要返回值?
      

  9.   

    你只要不把default放在最后一行就OK了,只要你得到的不是0 1 2,就会返回default语句后面的那个变量
      

  10.   

    default: 
    case 0: return new Circle(); 
    case 1: return new Square(); 
    case 2: return new Triangle();这样的意思是说什么?
    是说不管是不是0,1,2,都先执行default: 这条语句假如不是,0,1,2 执行default是什么样?往后的流程是什么?假如是0,也先执行default?那往后的流程是什么?就是不懂他写在第一句是怎么执行的?
      

  11.   

    switch(5) 
       { 
       default:
       case 0: return 0; 
       case 1: return 1; 
       case 2: return 2; 
      
       } 
    我试了一下这个返回0,
    当defalut中条件都不满足时,执行了第一条语句;
    呵呵,我也学到了
      

  12.   

    default后面的变量是什么?  ???什么意思?
    你不是写的是语句块吗,这里面有返回类型就行了
      

  13.   

    default 放在switch里面那儿都行,当进入switch里面后,先找相匹配的,如果没有找到,
    则从default开始执行,一直到遇到break,或者到switch退出为止
      

  14.   

    我坚持我的观点,请看下面的代码和其中的注释:public class Test {
        public static void main(String[] args) {
            for (int i=0;i<10;i++) {//没有default部分结果就成了:1 2 3 
                switch(i) {
                    /* ======这里是把default放到上面的情况。
                    default://把下面两行删掉结果就成了:0 1 2 3 4 5 6 7 8 9 
                        System.out.print(i+" ");//单独删除这一行结果就成了:1 2 3 
                        break;//单独删除这一行结果就成了:0 0 1 2 3 4 4 5 5 6 6 7 7 8 8 9 9 
                    */
                    case 1:
                        System.out.print(i+" ");
                        break;
                    case 2:
                        System.out.print(i+" ");
                        break;
                    case 3:
                        System.out.print(i+" ");
                        break;
                    default://把下面两行删掉结果就成了:1 2 3 
                        System.out.print(i+" ");//单独删除这一行结果就成了:1 2 3 
                        break;//一般default放到尾部不需要这一行,单独删除这一行结果还是:0 1 2 3 4 5 6 7 8 9 
                        //以上代码不删除任何一行结果为:0 1 2 3 4 5 6 7 8 9 
                    /*同样的把default放到中间某部分也没有错误!所以我还是认为
                     default可以放到default语句的任何地方,只是放到不同的地方
                     运行结果可能不同。*/
                }
            }
        }
    }
      

  15.   


    public class Test {
        public static void main(String[] args) {
            for (int i=0;i<10;i++) {//没有default部分结果就成了:1 2 3 
                switch(i) {
                    /* ======这里是把default放到上面的情况。
                    default://把下面两行删掉结果就成了:0 1 2 3 4 5 6 7 8 9 
                        System.out.print(i+" ");//单独删除这一行结果就成了:1 2 3 
                        break;//单独删除这一行结果就成了:0 0 1 2 3 4 4 5 5 6 6 7 7 8 8 9 9 
                    */
                    case 1:
                        System.out.print(i+" ");
                        break;
                    case 2:
                        System.out.print(i+" ");
                        break;
                    case 3:
                        System.out.print(i+" ");
                        break;
                    default://把下面两行删掉结果就成了:1 2 3 
                        System.out.print(i+" ");//单独删除这一行结果就成了:1 2 3 
                        break;//一般default放到尾部不需要这一行,单独删除这一行结果还是:0 1 2 3 4 5 6 7 8 9 
                        //以上代码不删除任何一行结果为:0 1 2 3 4 5 6 7 8 9 
                    /*同样的把default放到中间某部分也没有错误!所以我还是认为
                     default可以放到default语句的任何地方,只是放到不同的地方
                     运行结果可能不同。*/
                }
            }
        }
    }