如何在java接口中创建变量

时间:2015-11-17 20:42:26

标签: java variables interface

我正在制作一个有不同类型建筑的游戏。我正在为每种类型制作一个界面。有些建筑有一种以上的类型。

我有这段代码:

public interface DefenseBuilding {
    int range;
    int damage;
    public void shoot ();
}

它给出了2个变量声明(范围和损坏)的错误。错误是“最终变量可能无法初始化”

如果我在界面中分配变量,它可以工作,但我不想这样做。

我不能只扩展一个类,因为 - 如前所述 - 一些建筑物需要超过1种类型。类只能扩展另外一个类,所以我需要使用接口。

我要问的是,有没有办法让接口中的变量不必初始化接口内的变量?

4 个答案:

答案 0 :(得分:2)

接口的重点是指定为接口 - 即您的类接口将如何与客户端类一起使用。实例变量显然不是任何接口的一部分。

相反,试试这个:

public interface DefenseBuilding {
  public void shoot ();
}

和此:

public abstract class AbstractDefenseBuilding implements DefenceBuilding {
  protected int range;
  protected int damage;
}

修改

您的类现在应该扩展AbstractDefenseBuilding,因此它们将继承变量。他们还间接实现DefenceBuilding,因此他们仍然会被迫实施shoot()方法(除非它们也是抽象的)

答案 1 :(得分:1)

您可以使用属性方法aproach。

public interface DefenseBuilding {
    public void setRange(int range);
    public int getRange();
    public void setDamage(int damage);
    public int getDamage();
    public void shoot ();
}

然后在你的班级

public MyClass implements DefenseBuilding{
    int range;
    int damage;
    public int getRange() {
        return range;
    }
    public void setRange(int range) {
        this.range = range;
    }
    public int getDamage() {
        return damage;
    }
    public void setDamage(int damage) {
        this.damage = damage;
    }

    public void shoot (){...}
}

答案 2 :(得分:0)

接口中的所有变量都是staticfinal。因此,除非初始化,否则编译器将继续给出一个未初始化的错误。这是强制执行的,因为接口无法实例化,因此任何变量都应该是静态的,不能更改。

如果您打算定义类变量,请按照NickJ的建议进行。

答案 3 :(得分:0)

接口定义行为但不定义状态(除了常量)。受保护的变量是正确封装数据的潜在危险(对象应隐藏其数据并通过方法提供访问,除非有非常令人信服的理由不这样做)。另一种选择是:

df(df(3))

提供部分实现接口的抽象类也很常见:

public interface DefenseBuilding {
  public void shoot();
  public int getRange();
  public int getDamage();
}