【问题标题】:Using a object specific variable in another class在另一个类中使用特定于对象的变量
【发布时间】:2012-05-01 23:28:38
【问题描述】:

我一直在查看所有其他问题,但似乎找不到问题的答案:我需要使用非静态字段(对于我创建的每个对象都是独立的)并且我需要访问该字段另一个类中的变量。一段代码:(Enemytank.java)

public class Enemytank extends MoveableGameItem implements IStepListener, IAlarmListener
{
    private Battlefield mygame;

    private Enemytank enemyTank1;   
    private static int enemyWaveSize = 1;
    private static int remainingKills = enemyWaveSize;
    private static double startupEnemyHealth = 100.00;
    private double enemyHealth = startupEnemyHealth;
    public int enemyStage = 0;              


    /**
     * Constructor.
     */
    public Enemytank(Battlefield mg)
    {
        mygame = mg;
        setImage("/images/enemytank.png", 27, 33);
        setPosition(25, 35);
        // snelheid 5, naar rechts
        setDirectionSpeed(0, 4);
        startMoving();
        mygame.addStepListener(this);
    }
}

我需要变量enemyStage的类:(Playertank.java)

public void collisionOccured(GameItem collidedItem)
    {
        Enemytank enemyTank1 = new Enemytank(mygame);
        System.out.println("pt= " + enemyTank1.getEnemyStage());
        if ((collidedItem instanceof Enemytank) && (playerShields > 0) && (enemyTank1.getEnemyStage() != 3))
        {
            this.playerShields--;
            mygame.setShieldsonDashboard(playerShields);

        }
        else if ((collidedItem instanceof Enemytank) && (playerShields <= 0) && (enemyTank1.getEnemyStage() != 3))
        {
            System.out.println("hit player!");
            this.playerLives--;
            mygame.setLivesonDashboard(playerLives);
        }
        if (collidedItem instanceof Shield)
        {
            this.playerShields++;
            mygame.setShieldsonDashboard(playerShields);
            mygame.deleteGameItem(collidedItem);
            this.playerUpgrades();
        }
    }

我现在从enemytank1.getEnemyStage() 得到的值是0,因为我相信我用EnemytankenemyTank1 = new Enemytank(mygame); 制作了一个新对象。。如何引用现有对象并获得该特定值? enemyStage 用于检查怪物是死了还是快死了。

提前谢谢 :) 火焰

【问题讨论】:

  • “我如何引用现有对象并获得该特定值?”是什么意思。您感兴趣的现有对象是什么?您可能希望显示更多代码。 enemyStage 是如何以及在哪里设置的?

标签: java oop object instance non-static


【解决方案1】:

您需要利用多态性。在GameItem 类(或者它是接口?)中声明方法getEnemyStage,然后您将能够询问collidedItem.getEnemyStage() 并从该对象中获取数据。或者,向下转换collidedItem 转换为EnemyTank 并调用方法:((EnemyTank)collidedItem).getEnemyStage()

另外,将enemyStage设为private,不必为public,因为它将通过调用getter方法间接访问。

if (collidedItem instanceof Enemytank && playerShields > 0 && 
    ((Enemytank)collidedItem).getEnemyStage() != 3) {
  ....
}

【讨论】:

  • -MoveableGameItem.java 是一个扩展 GameItem 的抽象类 -GameItem.java 是一个抽象类
  • 另外,GameItem.java 什么都没有。我不能在那里执行 getEnemyStage() ,因为它看不到 Enemytank.java 的任何内容,对吗?我尝试扩展战场.Enemytank(它在另一个包中)但它说一些超级构造函数是未定义的
  • 尝试更新答案中的代码。这就是我要说的。
  • 更新:谢谢!我拒绝了它,它现在似乎可以工作了:)
  • @MarkoTopolnik,您的答案是否使用多态性,尤其是在 GameItem 类中声明该方法也可用,即使该类在另一个包中?因为我现在正在为此苦苦挣扎。无法让它工作。
【解决方案2】:

当您调用碰撞发生时,您将引用传递给对象。因此,将碰撞发生更改为:

public void collisionOccured(GameItem collidedItem, Enemytank enemyTank) //a change here
    {
        System.out.println("pt= " + enemyTank.getEnemyStage()); // now you can call enemyTank with the correct refrence
        if ((collidedItem instanceof Enemytank) && (playerShields > 0) && (enemyTank1.getEnemyStage() != 3))
        {
            this.playerShields--;
            mygame.setShieldsonDashboard(playerShields);

        }
        else if ((collidedItem instanceof Enemytank) && (playerShields <= 0) && (enemyTank.getEnemyStage() != 3))
        {
            System.out.println("hit player!");
            this.playerLives--;
            mygame.setLivesonDashboard(playerLives);
        }
        if (collidedItem instanceof Shield)
        {
            this.playerShields++;
            mygame.setShieldsonDashboard(playerShields);
            mygame.deleteGameItem(collidedItem);
            this.playerUpgrades();
        }
    }

而且,当您在 EnemyTank 类中调用 collisionOccured 时,您会喜欢这样:

collisionOccured(collidedItem, this); //where this refrence to this object (which is a EnemyTank)

有了这个答案,我假设您从 EnemyTank 类中调用了 collisonOccured,因为您没有发布该调用的位置。如果不是,则在调用 collisionOccured 时需要对 EnemyTank 的对象进行引用(因此将调用中的 this 更改为对正确对象的引用)

【讨论】:

  • 我不能这样做,因为方法碰撞发生在 MoveableGameItem.java 中,它扩展到 GameItem.java。我不能指向“EnemytankenemyTank”
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多