Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java调用构造函数_Java_Constructor_Call - Fatal编程技术网

Java调用构造函数

Java调用构造函数,java,constructor,call,Java,Constructor,Call,我创建了一个测试项目,但遇到了一些我无法理解的问题 我想打电话给《战斗经理》中的怪物。我希望怪物的变量(名称,健康,伤害和防御)等于随机分配的任何怪物(狼怪或地精怪) 以前我只有一个怪物,我设法做到了,但是现在有两个怪物,如果选择了不同的怪物,我怎么能给变量传递不同的值呢 public class Units { int health; int damage; int defense; String name; public boolean isAliv

我创建了一个测试项目,但遇到了一些我无法理解的问题

我想打电话给《战斗经理》中的怪物。我希望怪物的变量(
名称
健康
伤害
防御
)等于随机分配的任何怪物(
狼怪
地精怪

以前我只有一个怪物,我设法做到了,但是现在有两个怪物,如果选择了不同的怪物,我怎么能给变量传递不同的值呢

public class Units {
    int health;
    int damage;
    int defense;
    String name;

    public boolean isAlive(){
        if(health >= 1){
            return true;
        }else{
            return false;
        }
    }
}

public class Monster extends Units{
    public Monster(String name,int health,int damage,int defense){
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class GoblinMonster extends Monster {
    public GoblinMonster(String name, int health, int damage, int defense) {
        super("Goblin",50,5,6);
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class WolfMonster extends Monster {
    public WolfMonster(String name, int health, int damage, int defense) {
        super("Wolf",50,5,6);
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class FightManager {

    GameManager manage = new GameManager();
    Player player = new Player("Player",100,10,5);
    GoblinMonster gobli = new GoblinMonster("Goblin", 40, 7, 4);
    WolfMonster wolf = new WolfMonster("Wolf",50,9,6);

    boolean myTurn = true;
    ....

我想知道如何根据生成的怪物来分配monster的值。

也许您想做的是在每个构造函数中将“name”设置为常量

例如,WolfMonster会是:

public class WolfMonster extends Monster {
    public static String TYPE = "Wolf";
    public WolfMonster(int health, int damage, int defense) {
        super(WolfMonster.TYPE,health,damage,defense);
    }
}

请注意,您不需要重新设计成员字段,因为在调用super()时将分配。

我认为这里不需要多个子类和父单位类。您可以简单地创建不同的怪物对象,名称为WolfMonster、GoblinMonster

public class Monster {
    int health;
    int damage;
    int defense;
    String name;

    Monster(String name, int health, int damage, int defense)
    {
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
    public boolean isAlive()
    {
        if(health >= 1){
            return true;
        }else{
            return false;
        }
    }    
}

public class FightManager {

    GameManager manage = new GameManager();
    Player player = new Player("Player",100,10,5);

    //changes

    Monster gobli = new Monster("Goblin", 40, 7, 4);
    Monster wolf = new Monster("Wolf",50,9,6);

    boolean myTurn = true;

    // To-Do
}

为此,您必须使用多态性,将单元类声明为接口。方法isAlive()与属性一样抽象。另一方面,类Monster应该实现单元接口,其余Monster类将扩展类E Monster。最后,您将在每个子类上覆盖isAlive()方法,然后瞧

不清楚你想要什么。你能指定你所说的值是什么意思吗?我认为这里不需要两个子类。它们具有完全相同的字段和相同的行为(没有重写的方法)。而且,您的构造函数没有意义。每个字段初始化两次:一次在基构造函数中,一次在子类构造函数中。您从子类构造函数中传递了一个硬编码的名称,但随后立即用传递的名称覆盖它。不确定问题出在哪里。您似乎对此感到困惑。您当前的代码根本不需要继承。您所有的“特殊”单元仅在属性上有所不同。但是继承应该被用来提供不同的行为,这意味着:同名但内容不同的方法。是的,我想到了,但在未来我计划添加更多的怪物,我认为使用这种方法会有点过分,你可以通过调用新的怪物(“SomeName”,40,7,4)来使用更多的怪物;你救了我,兄弟!真的很感谢,这是我一直在寻找的答案