你好,我有一个用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));
}
}
答案 0 :(得分:6)
第一个问题:
protected static Color color;
这意味着该字段(您有两个......)在整个类型中共享。我本以为这是一个实例字段,因此不同的颜色可以是不同的颜色。相反,所有星星都是相同的颜色,除非你在StarRed
中有一些使用color
字段的代码,在这种情况下你可能有两种颜色的星星。 ..但它仍然不对。
第二个问题:您的StarRed
类为x
,y
和color
声明了自己的字段,尽管它们也在超类中声明。然后,您将设置超类的radius
字段的值,尽管已经在超类构造函数中设置了它。
目前基本上有点困惑。您应该计算出与类型相关联的信息而不是任何特定实例(在这种情况下应该是静态字段)以及与各个实例相关联的信息(在这种情况下,这些实例应该是实例字段)。您几乎永远在子类和超类中使用相同的字段名称 - 我个人建议将所有字段设为私有(除了常量)。
最后,为什么StarRed
构造函数想要一个Color
?它不应该一直是红色的吗?
答案 1 :(得分:5)
您正在覆盖静态变量颜色。
静态关键字表示该类的所有实例都具有相同的颜色。
所以父和子指的是同一个静态变量。
因此,因为您以后只设置了儿童颜色,所以只有儿童颜色可以使用。
更改您的代码并删除静态
答案 2 :(得分: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
构造函数。
我希望它有所帮助:)。