继承相同父级的两个对象具有交换属性

Dol*_*iac 0 java inheritance abstract-class

我目前正在编写一个模拟Java中大规模战斗的群体AI程序.我正在使用一个抽象类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);
}
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,还有两个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()
{
}
}
Run Code Online (Sandbox Code Playgroud)

和军医:

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)
{
}
}
Run Code Online (Sandbox Code Playgroud)

请注意,这两个类大多相同,只是名称不同,而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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我得到奇怪的结果.出于某种原因,应该有3个健康的野蛮人从2开始,而应该有2个健康的医生从3开始.有人可以解释这种行为吗?

Sot*_*lis 5

你打印错了名字.特定

m.Attack(b);
Run Code Online (Sandbox Code Playgroud)

//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();
    }
}
Run Code Online (Sandbox Code Playgroud)

this是一个Medic.所以unitBarbarianname"Medic".所以它看起来就像Medic是真正的伤害Barbarian.