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

时间:2015-05-05 15:58:03

标签: java

标题说明了一切。

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

就像这样:

    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类的唯一重要性是出于多态性的目的。 上面的代码没有尝试过,所以如果我不确定它是否相应地运行。 我怎样才能打印出糖果的颜色?

2 个答案:

答案 0 :(得分:7)

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

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

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

  1. getColor永久不变。您可以在this答案中了解如何使类不可变。另请在Candy
  2. 中添加Candy方法
  3. 使candies[0][0] = new Candy("blue");成为不可变的后,您可以使用所需的颜色对其进行实例化。例如。 :Candy
  4. 每个color不需要一个Candy个子类。相反,您可以简单地为每个新color实例化一个新的candies[0][1] = new Candy("red");对象。例如。 color
  5. 您可以通过Candy
  6. 打印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方法,并且最小化拼写错误。