0

下面的代码出现在我的书中关于方法的章节中。我对几件事有点困惑。

  1. 当我相信该run()方法正在调用该createFilledCircle方法时,我的理解是否正确?
  2. 方法是run()接收者还是createFilledCircle发送者?
  3. 对于这三个add(createFilledCircles...red,yellow and green);,程序员如何知道参数中允许哪些信息?(x location, y location, width of figure, height of figure)中使用的格式是add(createFilledCircle)


import acm.program.*;
import acm.graphics.*;
import java.awt.*;

public class StopLight extends ConsoleProgram {
  public void run() {
    double cy = getWidth() / 2 ;
    double cx=  getHeight() / 2; 

    double fx = cx - (FRAME_WIDTH / 2);
    double fy = cy - (FRAME_HEIGHT /2 );

    double dy = (FRAME_HEIGHT / 4 ) + (LAMP_RADIUS / 2);

    GRect frame = new GRect (fx, fy, FRAME_WIDTH, FRAME_HEIGHT);
    frame.setFilled(trye);
    frame.setColor(Color.GRAY);
    add(frame);

    add(createFilledCircle(cx, cy-dy, LAMP_RADIUS, Color.RED));
    add(createFilledCircle(cx, cy, LAMP_RADIUS, Color.YELLOW));
    add(createFilledCircle(cx, cy + dy, LAMP_RADIUS, Color.GREEN));
  }

  private GOval createFilledCircle (double x, double y, double r, Color color) {
    GOval circle = new GOval (x -r, y -r, 2 * r, 2 * y );
    circle.setFilled(true);
    circle.setColor(color);
    return circle; 
  }

  private static final double FRAME_WIDTH = 50; 
  private static final double FRAME_HEIGHT = 100;
  private static final LAMP_RADIUS = 10; 
}
4

4 回答 4

0

1)当我认为 run() 方法正在调用 createFilledCircle 方法时,我的理解是否正确?

是的,这是正确的。它在内部被调用,因此输出createFilledCircle是方法的参数add

add(createFilledCircle(cx, cy-dy, LAMP_RADIUS, Color.RED));

2) run() 方法是接收者,createFilledCircle 是发送者吗?

我认为这不是该代码的正确术语。没有发送和接收。对象在内部创建createFilledCirclerun将该对象添加到自身。

于 2012-12-04T08:11:58.787 回答
0

1) Is my understanding correct when I believe that the run() method is calling the createFilledCircle method?

是的。

2) Is the run() method the receiver and the createFilledCircle the sender?

在面向对象编程中,sender通常receiver是参与通信的对象或类。在您的情况下,从inside 调用方法StopLight时,实例本身既是发送者又是接收者。再举一个例子,在 中,instance ( ) 是消息的发送者,也是消息的接收者(在 Java 中,OOP 意义上的消息基本上是一个方法调用)。createFilledCirclerunframe.setFilled(trye);StopLightthisframesetFilled

3) for the three add(createFilledCircles...red,yellow and green); how does the programmer know what information is permitted in the argument? Is the format of (x location, y location, width of figure, height of figure) being used in the add(createFilledCircle)?

程序员通常通过文档或查看源代码知道这一点:-)

add在您的类层次结构中必须至少有一个方法,并且您需要查看这些方法的参数列表以了解允许哪些参数。理想情况下,有一个可用的 JavaDoc 文档,它不仅列出了参数类型本身,而且还提供了一些关于如何使用它们以及相应方法实际作用的见解。在您的情况下,由于createFilledCircle返回GOval引用,因此需要有一个add将兼容的类型GOval作为参数的方法。同样,该createFilledCircle方法(在您的类本身中声明)采用三个double值和一个Color对象引用,这实际上也是您调用它的方式。

于 2012-12-04T08:12:15.273 回答
0

1)是的 - 它调用它

add(createFilledCircle(cx, cy-dy, LAMP_RADIUS, Color.RED));
  add(createFilledCircle(cx, cy, LAMP_RADIUS, Color.YELLOW));
  add(createFilledCircle(cx, cy + dy, LAMP_RADIUS, Color.GREEN));

2) 它是发送者,但 add() 方法是接收者。

3) createFilledCircle 指定了它的方法参数...

createFilledCircle (double x, double y, double r, Color color)
于 2012-12-04T08:12:34.497 回答
0

1)当我认为 run() 方法正在调用 createFilledCircle 方法时,我的理解是否正确?

是的。

2) run() 方法是接收者,createFilledCircle 是发送者吗?

我不知道您所说的“接收者”和“发送者”是什么意思。这些不是人们在谈论被调用的方法时通常使用的术语。

(它看起来像 Smalltalk 编程语言中的术语,这是一种早期的面向对象语言。鉴于此,它正好相反:你会说run是发送者和createFilledCircle接收者。)

3) 为三个添加(createFilledCircles...red,yellow and green); 程序员如何知道参数中允许哪些信息?add(createFilledCircle) 中是否使用了(x 位置、y 位置、图形宽度、图形高度)的格式?

方法的声明createFilledCircle指定了该方法需要哪些参数:三个double值和一个Color值。

在这样的一行中:

add(createFilledCircle(cx, cy-dy, LAMP_RADIUS, Color.RED));

发生的情况是createFilledCircle首先使用参数调用cx, cy-dy, LAMP_RADIUS, Color.RED,然后将方法的返回值(createFilledCircle一个GOval值)传递给add方法。与此相同:

GOval result = createFilledCircle(cx, cy-dy, LAMP_RADIUS, Color.RED);
add(result);
于 2012-12-04T08:13:05.413 回答