-4

好的,所以我有三节课

abstract class Shape  
{  
int width, height;  
String color;

public void draw()    
{      
}
    } // end Shape class

``

class Rectangle extends Shape
   {
Rectangle(int w, int h, String color)
{
    width = w;
    height = h;
    this.color = new String(color);
}

public void draw()
{
    System.out.println("I am a " + color + " Rectangle " + width + " wide and " + height + " high.");
}
   }// end Rectangle class

``

 class Circle extends Shape
   {
  Circle (int r, String color)
   {
    width = 2*r;
    height = 2*r;
    this.color = new String(color);   
}
public void draw()
{
    System.out.println("I am a " + color + " Circle with radius " + width + ".");
}
    } // end Circle class

`` 我要做的是创建一个新类来产生以下输出:我是一个蓝色 Rectangle 20 宽和 10 高。我是一个半径为 30 的红色圆圈。我是一个 25 宽和 25 高的绿色矩形 但我在调用方法 draw() 时遇到问题;

 This is the main class:
 public class Caller
  {
   public static void main(String args[]) 
    {
Caller call= new Caller();
Shape[] myShape = new Shape[3];

   myShape[0] = new Rectangle(20,10,"blue");
   myShape[1] = new Circle(30, "red");
   myShape[2] = new Rectangle(25,25, "green");
   for (int i=0; i < 3; i++)
     {
System.out.println();
     }
    call.draw(Rectangle);
    call.draw(Circle);
   } 
   }
4

4 回答 4

2

你的代码格式很糟糕,所以这只是一个猜测。我觉得你应该改变

for (int i=0; i < 3; i++)
     {
System.out.println();
     }
    call.draw(Rectangle);
    call.draw(Circle);

for (int i=0; i < myShape.length; i++) {
    myShape[i].draw();
}

此外,在Shape班级变更中

public void draw()
{
}

public abstract void draw();
于 2013-04-23T18:35:06.650 回答
1

您的 draw() 方法是在您的 Shape 类上定义的,而不是在您的 Caller 类上。

myShape[0].draw() 例如打印出矩形。

于 2013-04-23T18:33:38.337 回答
0

在您的for循环中,您需要为您正在draw使用的特定方法调用该方法,除非您想要另一个空白行,否则您Shape不需要调用。System.out.println()

for (int i=0; i < 3; i++)
{
    myShape[i].draw();
}

删除像call.draw. 您不使用call调用方法。事实上,您甚至不需要Caller对象的实例。只需在已有draw的对象上调用该方法即可。Shape

正如 jlordo 的回答一样,Shape如果类没有方法,则不需要抽象。因此,您可以创建draw方法abstract,也可以abstractShape类中删除。

于 2013-04-23T18:34:19.090 回答
0

您的代码有几个问题:

1) 抽象类中的 draw() 方法应该是抽象的。或者,您可以将其实现为“部分”,就像我在下面发布的解决方案中一样,然后在 Shape 类中没有 abstract 关键字:

2) 不需要 new String("color")。字符串是不可变的,所以你可以写如下。

3)您错过了指定您的班级成员是私有的还是公共的或受保护的。考虑变量的可见性总是一个好主意。

4)您尝试打印直径而不是半径

5)您尝试在类而不是实例上调用方法

这是我的建议(未经测试......可能还有更多我没有看到的问题):

class Shape  
{  
  protected int width, height;  
  protected String color;

  public void draw()    
  {      
    System.out.print("I am a " + color");
  }
} // end Shape class

class Rectangle extends Shape
{
  Rectangle(int w, int h, String color)
  {
    this.width = w;
    this.height = h;
    this.color = color;
  }

  public void draw()
  {
    super();
    System.out.print(" Rectangle " + width + " wide and " + height + " high.\n");
  }
}// end Rectangle class

class Circle extends Shape
{
  Circle (int r, String color)
  {
    this.width = 2*r;
    this.height = 2*r;
    this.color = new String(color);   
  }
  public void draw()
  {
    super();
    System.out.print(" Circle with radius " + (width/2) + ".\n");
  }
} // end Circle class

稍后在 main 方法中,您需要执行以下操作:

Shape[] myShape = new Shape[3];

myShape[0] = new Rectangle(20,10,"blue");
myShape[1] = new Circle(30, "red");
myShape[2] = new Rectangle(25,25, "green");
for (int i=0; i < 3; i++)
{
  myShape[i].draw();
}
于 2013-04-23T18:56:48.520 回答