【问题标题】:Java static/nonstatic methodJava 静态/非静态方法
【发布时间】:2015-10-27 00:50:45
【问题描述】:

我开始从事我的第一个 java 项目,这是一个基本的 RPG,我有一个关于咒语的问题。我有一个名为Character 的抽象类,它由一些子类扩展(如FighterMage 等)。只有施法者可以施法。关于法术 - 我有一个名为 Spell 的类,它描述了一个法术(它的名称、效果、法力等)。所有的法术都存储在具有spellsList 列表的SpellsList 类中(Spell 类的对象)。我有一个Effect 类(很可能它会成为一个接口),它有一些像“伤害”和“治愈”这样的效果,但我暂时没有使用它,我只是想测试一下我有作品。

我的问题是Mage 的方法addToSpellBookshowSpellBook 给出了编译器错误:java can't find symbol: method addToSepllBook, location: variable hero of type Game.Character。也适用于showSpellBook。为什么以及如何解决它? (问题可能在Mage/Spell/SpellsList 类中,而不是Character 很长,所以它不那么令人生畏:))

public class Game {
public static void main(String[] args) throws IOException {

    CharacterCreator heroCreator = new CharacterCreator();
    CharacterCreator.showAllClasses();

    Scanner sc = new Scanner(System.in);
    int scan = sc.nextInt();
    String chosenClass = CharacterCreator.getCharacterClass(scan);
    Character hero = CharacterCreator.createCharacter(chosenClass);
    try {
        hero.displayCharacter();
    }catch (Exception e){
        System.out.println("Wrong input");
    }




    if (hero.getCharacterClass().equals("Mage")){
        hero.addToSpellBook("Fireball");
        hero.showSpellBook();
    }



}

   }

public class CharacterCreator {

public static Character createCharacter(String chosenClass) {

    Character hero = null;

    System.out.println("Choose Name:");
    Scanner nameIn = new Scanner(System.in);
    String name = nameIn.next();


        switch (chosenClass) {
            case "Fighter":
                return new Fighter(name);
            case "Rogue":
                return new Rogue(name);
            case "Mage":
                return new Mage(name);
            case "Cleric":
                return new Cleric(name);
            case "def":
                System.out.println("Wrong input");
                return null;
            default:
                return null;
        }


}

public static void  showAllClasses(){
    System.out.println("Choose a character: ");
    System.out.println("1. Fighter");
    System.out.println("2. Rogue");
    System.out.println("3. Mage");
    System.out.println("4. Cleric");
}


public static String getCharacterClass(int scan){

    String classIn;

    switch (scan) {
        case 1:
            classIn = "Fighter";
            break;
        case 2:
            classIn = "Rogue";
            break;
        case 3:
            classIn = "Mage";
            break;
        case 4:
            classIn = "Cleric";
            break;
        default:
            System.out.println("Enter again");
            classIn = "def";
    }

    return classIn;
}

}


abstract public class Character {

    private String name;
    private String characterClass;
    private int level;
    private int hp;
    private int currentHp;
    private int armorClass;

    private long xp;
    /*private int BAB; /*Base attack bonus*/

    private int strength;
    private int constitution;
    private int dexterity;
    private int intelligence;
    private int wisdom;
    private int charisma;


    protected Character(String name){

        setName(name);
        setCharacterClass("Class");
        setLevel(1);
        setStrength(10);
        setConstitution(10);
        setDexterity(10);
        setIntelligence(10);
        setWisdom(10);
        setCharisma(10);
        setHp(0);
        setCurrentHp(getHp());
        setArmorClass(10);
        setXp(0);

    }


    void displayCharacter() throws IOException{
        System.out.print("\n\n\n");
        System.out.println("Name: " + getName());
        System.out.println("Class: " + getCharacterClass());
        System.out.println("Level: " + getLevel());
        System.out.println("HP: " + getHp());
        System.out.println("Current HP: " + getCurrentHp());
        System.out.println("Armor Class: " + getArmorClass());

        System.out.println("***************");
        System.out.println("Attributes: ");
        System.out.println("Strength: " + getStrength());
        System.out.println("Constitution: " + getConstitution());
        System.out.println("Dexterity: " + getDexterity());
        System.out.println("Intelligence: " + getIntelligence());
        System.out.println("Wisdom: " + getWisdom());
        System.out.println("Charisma: " + getCharisma());
        System.out.println("***************");
        System.out.println("XP: " + getXp());

    }

    public int getModifier(int number){
        int mod = (int)((number -10)/2);
        return mod;
    }

    public String getName() { return name; }
    public String getCharacterClass() { return characterClass; }
    public int getLevel() { return level; }
    public int getHp() { return  hp; }
    public int getCurrentHp() { return  currentHp; }
    public int getArmorClass() { return  armorClass; }
    public int getStrength(){ return strength; }
    public int getConstitution(){ return constitution; }
    public int getDexterity(){ return dexterity; }
    public int getIntelligence(){ return intelligence; }
    public int getWisdom(){ return wisdom; }
    public int getCharisma(){ return charisma;}
    public long getXp(){ return xp;}


    protected void setName(String Name) { name = Name; }
    protected void setCharacterClass(String characterClass) { this.characterClass = characterClass; }
    protected void setLevel(int lvl){ level = lvl; }
    protected void setHp(int hitPoints){ hp = hitPoints; }
    protected void setCurrentHp(int curHp){ currentHp = curHp; }
    protected void setArmorClass(int ac){ armorClass = ac; }
    protected void setStrength(int str){ strength = str; }
    protected void setConstitution(int con){ constitution = con; }
    protected void setDexterity( int dex) { dexterity = dex; }
    protected void setIntelligence(int intel){ intelligence = intel; }
    protected void setWisdom(int wis){ wisdom = wis; }
    protected void setCharisma(int cha){charisma = cha; }
    protected void setXp(int XP){xp = XP; }

    }

public class Mage extends Character  {

private List<Spell> spellBook;

public Mage(String name){

    super(name);

    setName(name);
    setCharacterClass("Mage");
    setLevel(1);
    setStrength(10);
    setConstitution(10);
    setDexterity(14);
    setIntelligence(16);
    setWisdom(14);
    setCharisma(10);
    setHp((int) (4 + getModifier(getConstitution())));
    setCurrentHp(getHp());
    setArmorClass(10 + getModifier(getDexterity()));
    spellBook = null;

}

 void addToSpellBook(String spellName){

    Spell newSpell;
    newSpell = SpellsList.getSpell(spellName);
    spellBook.add(newSpell);

}

void showSpellBook(){

    for (Iterator<Spell> iter = spellBook.iterator(); iter.hasNext(); ) {
        Spell spell = iter.next();
        if (spellBook.equals(spell.getSpellName())) {
            System.out.println("Spell name: " + spell.getSpellName());
            System.out.println("Spell effect: " + spell.getEffect());
        }
        }
}

}



public class Spell {
private String name;
private int spellLevel;
private String effect;
private int manaCost;
private int duration;

Spell(String name, int spellLevel, String effect, int manaCost, int duration){
    this.name = name;
    this.spellLevel = spellLevel;
    this.effect = effect;
    this.manaCost = manaCost;
    this.duration= duration;
}


void castSpell(String spellName, Character hero, Character target){
    try {
        Spell spell = SpellsList.getSpell(spellName);
        System.out.println("You casted: " + spellName);
        System.out.println("Spell effect: " + spell.effect);
    }
    catch (Exception e){
        System.out.println("No such spell");
    }
}

String getSpellName(){ return name; }

int getSpellLevel() {return spellLevel; }

String getEffect(){ return effect; }

int getManaCost(){
    return manaCost;
}

int getDuration() { return  duration; }
}


public class SpellsList {
static List<Spell> spellsList = new ArrayList<Spell>();
static

{
    spellsList.add(new Spell("Fireball", 3, "damage", 5,0 ));
    spellsList.add(new Spell("Ice Storm", 4, "damage", 8, 0));
    spellsList.add(new Spell("Heal", 2, "heal", 4, 0));
}

static Spell getSpell(String spellName) {
    try {
        for (Iterator<Spell> iter = spellsList.iterator(); iter.hasNext(); ) {
            Spell spell = iter.next();
            if (spellName.equals(spell.getSpellName())) {
                return spell;
            }
        }

    } catch (Exception e){
        System.out.println(spellName + " haven't been found in spells-list");
        return null;
    }
    return null;

}

}

【问题讨论】:

  • heroCharacter 类型,它没有定义也没有声明 addToSpellBook...

标签: java methods


【解决方案1】:

hero 是 Character 类型。你应该把它施放给法师。或在 Character 类中添加 addToSpellBook 并在 Mage 类中覆盖它。比如:

if(hero instanceof Mage)
   ((Mage) hero).addToSpellBook();

【讨论】:

  • 我不希望字符在抽象类Character中有这个方法。在工厂里把英雄交给法师是明智的吗?
  • 你可以验证它是Mage类然后施放它。使用 instanceof(Mage);
  • 在“if : line: 类型的非法开始,不是语句,并且:预期中
  • 法师可能是问题所在......虽然这很奇怪,因为它是作为法师创建的
  • 是的,但你应该将英雄声明为法师。对不起,我错过了。你能展示你的 CharacterCreator 类吗?它应该返回一个 Mage 对象......
【解决方案2】:

编译时的变量类型和执行时的类是有区别的。问题是你的 hero 变量不是Mage 类型而是Character 类型,并且只能访问任何Character 可用的方法。

编译器也不会注意到您尝试确保heroMage 的实例的逻辑。告诉它你知道你有 Mage 并且想要使用你需要转换的 Mage 方法。

您的验证方式没问题,但我建议使用instanceof 关键字。

if(hero instanceof Mage) {
   ((Mage)hero).addToSpellBook("Fireball");
   ((Mage)hero).showSpellBook();
}

【讨论】:

  • 现在我在 Game 的最后一个 } 中只有一个编译错误。解析时到达文件末尾。
  • Java 不确定它是否可以使用 Mage 的方法,因为它知道它是 Character,对。现在我明白是什么原因造成的了。谢谢 ! .虽然我还有一个错误...
  • @Niminim 我相信您会找到或添加适当的}。祝你好运。
  • spellBook 在 Mage 的构造函数中或者构造函数之前是错误的,对吧?可能是空指针...
  • @Niminim。好吧,spellBooknull 可能会导致运行时问题。
【解决方案3】:

您在 Character 类上调用了 addToSpellBookshowSpellBook 方法,但在 Character 类中没有具有此名称的方法。

【讨论】:

  • 我不希望字符在抽象类Character中有这个方法。我能做什么?
  • 您可以在 Character 中编写抽象方法并在扩展“Character”的类中覆盖它们。
  • 这意味着我必须在Character的每个子类中添加一个黑色的两个方法。有什么优雅的解决方案吗?
  • 这就是为什么你通常不使用继承系统来编写游戏。例如,对于编程游戏,您可以使用更出色的实体组件系统,但我认为对于您的小游戏来说,这将是矫枉过正:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多