【问题标题】:Defining class field and calling parent's constructor定义类字段并调用父类的构造函数
【发布时间】:2017-11-12 03:35:36
【问题描述】:

这是我写的两类代码..这里的问题是我不确定如何定义类字段来表示草、火和水作为使用静态的类型.. 另外我不确定我是否以正确的方式使用了超级函数。如何正确调用父级的构造函数,这样我就不必重新定义“knockedOut boolean”并能够使用 Fire 作为类型? 问题可能令人困惑,但我不确定如何更好地解释它:(对不起

public abstract class Pokemon {
private String name;
private String type;
private int attack;
private int health;
private boolean knockedOut;
static private String Grass;
static private String Water;
static private String Fire;  
public Pokemon (String n, String t, int a, int h) {
    name = n;//state
    type = t;//state
    attack = a;//state
    health = h;//state
    knockedOut = false;
}

public abstract int takeDamage(Pokemon enemy);

public String toString() {
    return  "}";
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public int getAttack() {
    return attack;
}

public void setAttack(int attack) {
    this.attack = attack;
}

public int getHealth() {
    return health;
}

public void setHealth(int health) {
    this.health = health;
}

public boolean isKnockedOut() {
    return knockedOut;
}

public void setKnockedOut(boolean knockedOut) {
    this.knockedOut = knockedOut;
}


}

public abstract class Charizard extends Pokemon {
private static String Fire;
private int attackFire;
private int healthFire;
private static String Water;
private static String Grass;
public Charizard(int a, int h) {
    super("Charizard", Fire, a, h);
    attackFire = a;
    healthFire = h;


}
public int takeDamage(Pokemon enemy){
    int enemyAttack = enemy.getAttack();
    if(enemy.getType().equals(Water)){
        enemy.setHealth(enemy.getHealth()-attackFire/2);
        healthFire = healthFire-enemy.getAttack()*2;
        if(enemy.getHealth()<=0){
            enemy.setKnockedOut(true);
        }
    }
    else if(enemy.getType().equals(Fire)){
        enemy.setHealth(enemy.getHealth()-attackFire/2);
        healthFire = healthFire-enemy.getAttack()*2;
        if(enemy.getHealth()<=0){
            enemy.setKnockedOut(true);
        }
    }
    else if(enemy.getType().equals(Grass)){
        enemy.setHealth(enemy.getHealth()-attackFire/2);
        healthFire = healthFire-enemy.getAttack()/2;
        if(enemy.getHealth()<=0){
            enemy.setKnockedOut(true);
        }
        if(healthFire <=0){
            Charizard.set = true;
        }
    }
    return enemyAttack;
}

}

【问题讨论】:

    标签: java static extends super


    【解决方案1】:

    你想像这样声明你的不同类型:

    static public final String GRASS= "Grass";
    static public final String WATER = "Water";
    static public final String FIRE = "Fire";  
    

    (我在这里遵循既定约定,声明staticpublicfinal 的字段名称应全部大写。)

    通过声明这些字段public,可能需要测试Pokemon 类型的任何其他类(包括扩展Pokemon 的类,例如Charizard)都可以使用它们。通过声明它们final,即使它们是public,也没有人可以更改它们。通过赋予它们初始值,您可以使它们真正用于区分不同类型的Pokemon,并避免在您第一次执行类似p.getType().equals(Pokemon.FIRE) 的操作时不可避免的NullPointerException

    至于knockedOut,看来您的处理方式是正确的。 knockedOut 字段在 Pokemon 中是私有的,但您提供了公共 getter 和 setter 方法,其他类可以(并且确实)使用它来访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      相关资源
      最近更新 更多