java - 继承同一父对象的两个对象交换了属性

标签 java inheritance abstract-class

我目前正在编写一个群体 AI 程序,用 Java 模拟大规模战斗。我使用的是抽象类 AIUnit,定义如下:

public abstract class AIUnit
{
private int health;

protected AIUnit(int health)
{
    this.health = health;
}

public abstract void Move();    //Move unit
public abstract void Attack(AIUnit unit);   //Attack unit in front
public abstract void Send(int freq,int msg);    //Send message on frequency
public abstract void Recv();    //Receive message

public int GetHealth()
{
    return health;
}

public void TakeDamage(String name)
{
    --health;
    System.out.println(name+" took damage!  Health remaining: "+health);
    if (health == 0)
    {
        System.out.println(name+" is dead!");
        this.Die();
    }
}

public void Die()
{
    System.exit(0);
}
}

目前有两个 AI 类别:野蛮人和医生,定义如下: 野蛮人:

public class Barbarian extends AIUnit
{   
private String name = "Barbarian";
public Barbarian(int health)
{
    super(health);
}
//Move unit
public void Move()
{
}
//Attack unit in front
public void Attack(AIUnit unit)
{
    unit.TakeDamage(name);
}
//Send message on frequency
public void Send(int freq, int msg)
{
}
//Receive message
public void Recv()
{
}
}

和医生:

public class Medic extends AIUnit
{
private String name = "Medic";
public Medic(int health)
{
    super(health);
}
//Move unit
public void Move()
{
}
//Attack unit in front
public void Attack(AIUnit unit)
{
    unit.TakeDamage(name);
}
//Send message on frequency
public void Send(int freq, int msg)
{
}
//Receive message
public void Recv()
{
}
//Heal unit
public void Heal(AIUnit unit)
{
}
}

请注意,这两个类大部分相同,仅名称不同,并且 Medic 类有一个未实现的 Heal 方法。

现在,使用以下 Main 类测试简单的 Attack 方法时:

import java.util.Random;

public class Main
{
public static int barbhealth = 3;
public static int medhealth = 2;
public static void main(String[] args)
{
    Random rand = new Random();
    int whoAttacks = rand.nextInt() % 2;
    Barbarian b = new Barbarian(barbhealth);
    Medic m = new Medic(medhealth);
    for(;;whoAttacks = rand.nextInt() % 2)
    {
        if (whoAttacks == 0)
            m.Attack(b);
        else
            b.Attack(m);
    }
}
}

我得到了奇怪的结果。由于某种原因,应该有 3 生命值的野蛮人从 2 开始,而应该有 2 生命值的医生从 3 开始。任何人都可以解释这种行为吗?

最佳答案

您打印的名称错误。鉴于

m.Attack(b);

//Attack unit in front
public void Attack(AIUnit unit)
{
    unit.TakeDamage(name);
}

public void TakeDamage(String name)
{
    --health;
    System.out.println(name+" took damage!  Health remaining: "+health);
    if (health == 0)
    {
        System.out.println(name+" is dead!");
        this.Die();
    }
}

此人是一名医生。所以unit是一个Barbarianname“Medic”。所以看起来Medic正在受到伤害,而实际上它是Barbarian

关于java - 继承同一父对象的两个对象交换了属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26024350/

相关文章:

java - 从 Java 读取 RAW 图像

从实现 IComparable<T> 的东西继承时,C# BinarySearch 中断了吗?

c# - 在 Inherited Class Constructor C# 中强制部分基初始化(和方法)(就像抽象对方法所做的那样)——解决这个问题

java - 抽象类中抽象方法应该有什么访问修饰符?

Java:检查数组中是否存在三个或更多匹配项

java - 如何在 IntelliJ IDEA 13 中将存储库添加到 "Indexed Maven Repositories"?

java - 身份验证方法

ios - 为什么允许在实现内部的@interface中重写ivar,但是具有这种奇怪的行为?

JavaScript:如何检测ES6类有自己的构造函数?

java - Java中的抽象类和接口(interface)