如何在不使用getter的情况下访问派生类静态成员?

pau*_*ulj 2 java

标题说明了一切.

我在每个派生类中都有一个独特的颜色,它被声明为静态.

就像这样:

    class CandyBlue extends Candy
   {
      public static final String color = "blue";
   }



 class CandyRed extends Candy
   {
      public static final String color = "red";
   }
Run Code Online (Sandbox Code Playgroud)

然后我有一个类型为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;
       }
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

Candy班没有一个成员的颜色,所以我不需要将它张贴.Candy类的唯一重要性是出于多态性的目的.上面的代码没有尝试过,所以如果我不确定它是否相应地运行.我怎样才能打印出糖果的颜色?

CKi*_*ing 7

假设Candy该类有一个color变量,你可以通过说明来打印糖果的颜色candy.color.

话虽这么说,语句candy.color总是会打印分配给类中color变量的值Candy.这是因为运行时多态仅适用于实例方法.static使用引用类型在编译时解析字段(无论是否).

您需要对所有类进行以下更改:

  1. Candy一成不变.您可以在答案中阅读有关如何使类不可变的内容.还要添加一个getColor方法Candy
  2. 一旦你创建了Candy不可变的,你可以用所需的颜色实例化它们.例如:candies[0][0] = new Candy("blue");
  3. Candy每个都没有必要有一个子类color.相反,您可以简单地Candy为每个新对象实例化一个新对象color.例如candies[0][1] = new Candy("red");
  4. 您可以打印colorCandycandy.getColor()

话虽这么说,你也可以考虑使用一个enum被调用的Candy而不是一个Candy类,因为看起来你想要的只是一个String常量,代表一个color:

public enum Candy {
    RED,BLUE,GREEN;
}
Run Code Online (Sandbox Code Playgroud)

  • @YanickRochon谢谢.如果不同的糖果具有不同的特性,可以延长糖果.Candy中常见的任何属性都应添加到Candy中.或者,可以通过合成提供需要添加到Candy的任何行为.我认为在这种情况下使Candy不可变是可以辩论的,使用枚举将不再有意义.此答案仅基于问题中提供的有限代码 (2认同)