2

你好,我有一个类在 Java 中画了一颗星,它就像一个魅力。在此之后,我扩展了 Star 类以创建另一个具有扩展可能性的星星(在这种情况下,颜色必须不同)

出于某种原因,当我调用类并使用构造函数提供参数时,我的面板中只有子类颜色似乎有效。

这是我的代码

    public class Star {

    protected int radius;
    protected int xmiddelpunt;
    protected int ymiddelpunt;
    protected static Color color;

    public Star(int radius, int x, int y, Color color) {
        xmiddelpunt = x;
        ymiddelpunt = y;
        this.radius = radius;

        this.color = color;
    }

}

和扩展类

    public class StarRed extends Star {

    protected int x, y;
    protected static Color color;

    Random red = new Random();

    public StarRed(int radius, int x, int y, Color color) {
        super(radius, x, y, color);

        this.radius = radius;
        this.x = x;
        this.y = y;
        this.color = color;
    }
}

我的面板类的构造函数如下:

    ArrayList<Star> stars = new ArrayList<Star>();
ArrayList<StarRed> rs = new ArrayList<StarRed>();

public HeavenPanel() {

    setBackground(Color.blue); // geef het paneel een blauwe kleur


    this.addMouseWheelListener(this); // set de mouselistener


    for(int i = 0; i < 10; i++) {
        stars.add(new Star (r.nextInt(30 + 50), r.nextInt(10 + 701), r.nextInt(10 + 701), Color.yellow));
    }

    for(int k = 0; k < 10; k++) {
        rs.add(new StarRed(40, r.nextInt(30 + 50), r.nextInt(30 + 50), Color.red));
    }

}
4

3 回答 3

6

第一个问题:

protected static Color color;

这意味着该字段(您有两个......)在整个类型中共享。我原以为这是一个实例字段,所以不同的星星可以是不同的颜色。相反,所有星星都是相同的颜色,除非你有一些StarRed使用该color字段的代码,在这种情况下你可能有两种颜色的星星......但它仍然不正确。

第二个问题:您的类为、和StarRed声明了自己的字段,尽管它们也在超类中声明。然后,您将设置超类字段的值,尽管已经在超类构造函数中设置了该值。xycolorradius

基本上,目前这一切都有些混乱。您应该弄清楚哪些信息与类型相关联,而不是任何特定实例(在这种情况下应该是静态字段)以及哪些信息与各个实例相关联(在这种情况下应该是实例字段)。您几乎应该在子类和超类中使用相同的字段名称 - 我个人建议将所有字段设为私有(可能除了常量)。

最后,为什么StarRed构造函数要使用 aColor呢?它不应该一直是红色的吗?

于 2012-12-05T11:47:07.830 回答
5

您正在覆盖静态变量颜色。

static 关键字意味着类的所有实例都具有相同的颜色。

所以父母和孩子指的是同一个静态变量。

因此,由于您稍后设置子颜色,因此只有子颜色有效。

更改代码并删除静态

于 2012-12-05T11:46:41.133 回答
1

正如其他答案所说,首先从public static Color color. 此外,您不需要重新声明类Star中的字段StarRed。从您的Random red = new Random()陈述中,我假设您想要进行一些计算StarRed以确定红色的色调,因此您添加了另一个受保护的 Star 构造函数,它省略了设置颜色。您将其用于StarRed. 的公共构造函数也Star将使用它,但另外设置了星星的颜色。

您的代码如下所示:

public class Star {

    protected int radius;
    protected int xmiddelpunt;
    protected int ymiddelpunt;
    protected Color color;

    public Star(int radius, int x, int y, Color color) {         
        this(x,y,radius)
        this.color = color;
    }

    protected Star(int radius, int x, int y) {
        xmiddelpunt = x;
        ymiddelpunt = y;
        this.radius = radius;

        this.color = color;
    }


}

和扩展类

public class StarRed extends Star {

    Random red = new Random();

    // Overrides Star constructor
    public StarRed(int radius, int x, int y, Color color) {
        super(radius, x, y); // Call protected superconstructor (radius, x,y)
        // Now we set the color, so the star is red (example code!)
        this.color = Color.RED;
        // You can still use color e.g. to define blue and green components of this.color

    }
}

顺便说一句:如果你例如从 StarRed 构造函数中删除颜色变量,那么你只会重载Star构造函数。

我希望它有帮助:)

于 2012-12-05T12:06:59.500 回答