class Shape{
void draw(){
System.out.println("画法");
}
void erase(){
System.out.println("擦出");
}
}class Circle extends Shape{
void draw(){
System.out.println("circle.draw()");
}
void erase(){
System.out.println("circle.erase()");
}
}class Square extends Shape{
void draw(){
System.out.println("square.draw()");
}
void erase(){
System.out.println("square.erase()");
}
}
class Triangle extends Shape{
void draw(){
System.out.println("triangle.draw()");
}
void erase(){
System.out.println("triangle.erase()");
}
}
public class DongTaiBangDing {

public static Shape randShape(){  //此处 提示 this method must return a type of Shape,该怎么改呢???(知道这是 要 返回 一个Shape 类型 变量的意思;)
switch((int)(Math.random()*3)){
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
}
}
public static void main(String args[]){
Shape[] s=new Shape[9];
for(int i=0;i<s.length;i++){
s[i]=randShape();
}
for(int j=0;j<s.length;j++){
s[j].draw();
}
}

}

解决方案 »

  1.   

    public static Shape randShape()
    去掉static
      

  2.   

    去掉static ,还是提示 那个
     如果去掉main 里面的static ,the selectiong does not support the mode
      

  3.   


    new DongTaiBangDing().randShape(); 
      

  4.   

    改成这个了
    public static Shape randShape(){
    Shape t=new Shape();
    switch((int)(Math.random()*3)){
    //case 0: return new Circle();
    //case 1: return new Square();
    //case 2: return new Triangle();
    case 0:
    t=new Circle();
    break;
    case 1: 
    t=new Square();
    break;
    case 2:
    t=new Triangle();
    break;
    }
    return t;
    }
    出来以下结果
    triangle.draw()
    circle.draw()
    triangle.draw()
    circle.draw()
    circle.draw()
    square.draw()
    triangle.draw()
    triangle.draw()
    circle.draw()
    直接写 return new 类名 ,不可以?
      

  5.   

    那个 new DongTaiBangDing().randShape();  写在哪里?
      

  6.   

    哦,那是 我看了网上 别人的写法,改写的,估计就是return 和 new 连着,不认得 new 类名? 
      

  7.   

    试验了一下,和static无关,应该是这样:动态绑定在运行时做类型识别,当randShape方法返回父类型Shape对象t,编译时不需要关注返回对象真正的类型是Circle,Square还是Triangle。case 0: return new Circle();
    case 1: return new Square();
    case 2: return new Triangle();这么写,就不符合编译器的规则了,明摆着返回的类型是Circle,Square和Triangle,而方法声明要求的类型是Shape。
      

  8.   

    编译时不需要关注返回对象真正的类型是Circle,Square还是Triangle不懂
      

  9.   

    s[i]=randShape(); 就是把 return 返回的t 给了 s[i],左边是父类,右边是子类,运行的时候看右边 的 对象变量,这和 instanceof 用法时 看 右边变量是一样的