标题说明了一切。
我在每个派生类中都有一个独特的颜色,并且它被声明为静态。
就像这样:
class CandyBlue extends Candy
{
public static final String color = "blue";
}
class CandyRed extends Candy
{
public static final String color = "red";
}
然后我有一个类型为Candy的对象S
class CandyFrenzy
{
Candy candies[][];
public CandyFrenzy()
{
candies = new Candy[4][4];
candies[0][0] = new CandyBlue();
candies[0][1] = new CandyRed();
....
}
public static void main(String args[])
{
CandyFrenzy candyFrenzy = new CandyFrenzy();
Candy candy;
for(int a=0; a<4; a++)
{
for(int b=0; b<4; b++)
{
candy = candies[a][b];
//print the color of the candy;
}
}
}
}
Candy
类没有成员颜色,所以我不需要发布它。 Candy类的唯一重要性是出于多态性的目的。
上面的代码没有尝试过,所以如果我不确定它是否相应地运行。
我怎样才能打印出糖果的颜色?
答案 0 :(得分:7)
假设Candy
类有一个color
变量,您可以通过说candy.color
来打印糖果的颜色。
话虽如此,语句candy.color
始终会打印分配给color
类中Candy
变量的值。这是因为运行时多态仅适用于实例方法。使用引用类型在编译时解析字段(无论static
是否为Candy
。
您需要对所有课程进行以下更改:
getColor
永久不变。您可以在this答案中了解如何使类不可变。另请在Candy
Candy
方法
candies[0][0] = new Candy("blue");
成为不可变的后,您可以使用所需的颜色对其进行实例化。例如。 :Candy
color
不需要一个Candy
个子类。相反,您可以简单地为每个新color
实例化一个新的candies[0][1] = new Candy("red");
对象。例如。 color
Candy
candy.getColor()
的{{1}}
醇>
话虽这么说,您也可以考虑使用名为enum
的{{1}}而不是Candy
类,因为看起来您想要的只是一个表示{{1}的String常量}}:
Candy
答案 1 :(得分:2)
您没有以正确的方式使用static
属性。一次,您需要Candy
实例的颜色,因此实例方法应该没问题。为什么你有使用成员而不是方法的约束?那,你不是说。
正确的解决方案是继承。您应该Candy
是一个抽象类,声明您的颜色方法,并提供受控Color
值而不是字符串进行比较。
abstract class Candy {
public static enum Color {
RED,
BLUE,
ORANGE_WHITE_STRIPES,
...
}
public abstract Candy.Color getColor();
}
class CandyBlue extends Candy {
public Candy.Color getColor() { return Candy.Color.BLUE; }
}
class CandyOrangeSpecial extends Candy {
public Candy.Color getColor() { return Candy.Color.ORANGE_WHITE_STRIPES; }
}
然后只需致电
Candy.Color candyColor = candies[a][b].getColor();
表示该糖果实例的颜色。
使用enum
优于String
的优势在于,您可以轻松地将其与==
进行比较,而不是依赖于.equals
方法,并且最小化拼写错误。