Java:遇到一些代码语法问题

时间:2015-08-28 21:42:04

标签: java

为了完整起见,我在下面提供了完整的代码。

请帮我翻译以下英文内容:

class Ball extends Circle {
    private double dx = 1;
    private double dy = 1;

    public Ball (double x, double y, double radius, Color color) {
        super(x,y,radius);
        setFill(color);
        }
    }

//其他一些代码。

这是我的(不正确的)解释:

获取对Node的引用,并将引用设置为等于此类中的所有节点。

获取Ball的引用,并将其设置为node,将其转换为Ball。

除了不知道如何解释上述代码外,我也不太了解它的作用。

第二个问题是关于圈子类:

this.x = x;
this.y = y;
this.radius = radius;

调用super方法将等同于以下内容:

public void start(Stage primaryStage) {
    MultipleBallsPane ballsPane = new MultipleBallsPane();
    Button btnAddBall = new Button("+");
    Button btnRemoveBall = new Button("-");

    HBox hBox = new HBox();
    hBox.getChildren().addAll(btnAddBall, btnRemoveBall);
    hBox.setAlignment(Pos.CENTER);

    //add or remove ball

    btnAddBall.setOnMousePressed(e -> ballsPane.add());
    btnRemoveBall.setOnMousePressed(e -> ballsPane.subtract());

    //resume and pause animation

    ballsPane.setOnMousePressed(e -> ballsPane.pause());
    ballsPane.setOnMouseReleased(e -> ballsPane.play());

    //scroll bar to control animation speed

    ScrollBar sbSpeed = new ScrollBar();
    sbSpeed.setMax(20);
    sbSpeed.setMin(10);
    ballsPane.rateProperty().bind(sbSpeed.valueProperty());

    HBox hBox2 = new HBox();
    hBox2.getChildren().addAll(sbSpeed);
    hBox2.setAlignment(Pos.CENTER);


    BorderPane pane = new BorderPane();
    pane.setTop(hBox2);
    pane.setCenter(ballsPane);
    pane.setBottom(hBox);

    Scene scene = new Scene(pane,250, 150);
    primaryStage.setScene(scene);
    primaryStage.show();

}

public static void main(String[] args) {
    Application.launch(args);
}

// inner class MultipleBallsPane

private class MultipleBallsPane extends Pane {
    private Timeline animation;

    public MultipleBallsPane() {
        //create an animation for moving the ball
        animation = new Timeline(
                new KeyFrame(Duration.millis(50), e->moveBall()));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();

    }

    public void add() {
        Color color = new Color(Math.random(), 
                Math.random(), Math.random(), 0.5);
        getChildren().add(new Ball(30,30,20, color));

    }

    public void subtract() {
        if (getChildren().size() > 0 ) {
        getChildren().remove(getChildren().size() - 1);
        }
    }
    public void play() {
        animation.play();   
    }

    public void pause() {
        animation.pause();
    }

    public void increaseSpeed() {
        animation.setRate(animation.getRate() + 0.5);
    }

    public void decreaseSpeed() {
        if (animation.getRate() > 0) {
            animation.setRate(animation.getRate() - 0.5);
        }
    }


    public DoubleProperty rateProperty() {
        return animation.rateProperty();        

    }

    protected void moveBall() {
        for (Node node:this.getChildren()) {
            Ball ball = (Ball)node;


        //check boundaries
        if (ball.getCenterX() < ball.getRadius() ||
                ball.getCenterX() > getWidth() - ball.getRadius()) {
            ball.dx*= -1;   
        }

        if (ball.getCenterY() < ball.getRadius() ||
                ball.getCenterY() >getHeight() - ball.getRadius()) {
            ball.dy*= -1;
        }

        ball.setCenterX(ball.dx + ball.getCenterX());
        ball.setCenterY(ball.dy + ball.getCenterY());

    }
} // end of method

class Ball extends Circle {
    private double dx = 1;
    private double dy = 1;


    public Ball (double x, double y, double radius, Color color) {
        super(x,y,radius);
        setFill(color);
        }
    }
} // end of MultipleBallsPane class

为什么或为什么不呢?

公共类MultipleBounceBalls扩展了Application {

{{1}}

}

3 个答案:

答案 0 :(得分:0)

1)关于这个:

protected void moveBall() {
    for (Node node: this.getChildren()) {
        Ball ball = (Ball)node;

在这种情况下,for循环更多地是foreach,它通过子节点中的每个节点。对于每个节点,通过将Ball强制转换为node来创建Ball对象。简洁的英语:

对于此对象具有的子集中的每个节点,将每个节点转换为Ball。

Casting本质上是说一种数据类型(在本例中为Node)将被视为另一种(在本例中为Ball)。有关铸件的更多信息,请参考:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

2)super()调用父构造函数,在本例中为Circle。由于没有附加构造函数,所以只会猜测,但是相信Circle构造函数会执行您指定的函数是合乎逻辑的。 super()的一个很好的参考是:super() in Java

希望这有帮助!

答案 1 :(得分:0)

这解码为:

this的所有孩子使用this.getChildren()将其中第一个孩子分配到node

然后下一行应该运行,这一行创建一个局部变量ball,它等同于node,然后将其转换为Ball。

做其他代码。

重复直到不再有孩子离开。

至于圆圈,当你调用super时,它可能不那么简单,超级构造函数可以设置变量,或者它可以做一些其他逻辑。因此,在我看来,调用构造函数会更安全。

  • Culip

答案 2 :(得分:0)

假设以下语法正确:

protected void moveBall() {
    for (Node node:this.getChildren()) {
        Ball ball = (Ball)node;
    }
}

这可以理解为:

&#34; 对于getChildren()调用结果中可迭代/数组中的每个元素,此处引用为node且类型为{{1} },将Node的手动广告投放到类型为node的{​​{1}} Ball类型的变量。&#34;

第二

没有看到Ball的声明,这是不可能的。但是,如果ball中的声明确实接受了这些值,并且 将它们分配给那些特定的父字段,那么是的,它会相当于。