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_Inheritance_Object - Fatal编程技术网

在Java中删除对象时出现问题

在Java中删除对象时出现问题,java,inheritance,object,Java,Inheritance,Object,比方说一个图形世界,比方说一个世界,还有一个演员,我用演员固有的新类名Food构建了一个对象,但在某些情况下,我需要这个对象从我的世界中消失。 这样做的好方法应该是什么 我试过这个: public void killFood () { getWorld().removeObject(this); // >>>>>Kill any object that inherate from Food and operate this meth

比方说一个图形世界,比方说一个世界,还有一个演员,我用演员固有的新类名Food构建了一个对象,但在某些情况下,我需要这个对象从我的世界中消失。 这样做的好方法应该是什么

我试过这个:

public void killFood ()
    {
            getWorld().removeObject(this);  // >>>>>Kill any object that inherate from Food and operate this method.
    }
但它并没有杀死任何类中食物所固有的物体。。。为什么?

我(在食品类中)用以下材料包装:

公共无效法案()
{
if(canMove())
move();
其他的
杀戮食物();
}
公共布尔值canMove()
{
World myWorld=getWorld();
intx=getX();
int y=getY();
y--;
//境外检验
如果(x>=myWorld.getWidth()| | y>=myWorld.getHeight())
返回false;
else if(x<0 | | y<0)//如果在第一季度之外
返回false;
return true;//如果在第一个季度和边界内,则可以移动。
}
但物体并没有消失。。。为什么?

谢谢

========================================================================================== 编辑:canMove方法和蘑菇类

public boolean canMove()
    {
        World myWorld = getWorld();
        int x = getX();
        int y = getY();

        // test for outside border
        if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) {
            return false;
        }
        else if (x < 0 || y < 0) {
            return false;
        }
        return true;
    }

public class Mushroom  extends Food
{
    private final int NEED_TOGO_LEFT = 3;
    private int mushroomGotDown=0; // counter for regular +1 down steps

    public void move()
    {
            mushroomGotDown++;
            //  if mushroom didn't got down 2 times, go down one time.
            if (mushroomGotDown != NEED_TOGO_LEFT) 
                setLocation(getX() , getY() + 1);
                else    //  mushroom got down twise, third will be 1 step left.
                {
                    setLocation(getX() - 1 , getY());
                    mushroomGotDown=0;
                }    
    } 
}   // end of class Mushroom
public boolean canMove()
{
World myWorld=getWorld();
intx=getX();
int y=getY();
//境外检验
如果(x>=myWorld.getWidth()| | y>=myWorld.getHeight()){
返回false;
}
else如果(x<0 | | y<0){
返回false;
}
返回true;
}
公营蘑菇扩展食品
{
私人最终整数需要多哥左=3;
private int mushroomgotton=0;//常规+1下行步骤的计数器
公开作废动议()
{
MushroomGotton++;
//如果蘑菇没有下降两次,下降一次。
如果(MushroomGotton!=需要离开)
设置位置(getX(),getY()+1);
否则,蘑菇两次下山,第三次再走一步。
{
setLocation(getX()-1,getY());
mushroomgotton=0;
}    
} 
}//课程结束

它看起来像是
getWorld()。removeObject(此)
将只从您的世界中删除特定实例。它不会从您的世界中删除特定类的所有实例

需要对要删除的类的每个特定实例调用getWorld().removeObject

因此,要了解其工作原理,请尝试以下方法:

Food foo1 = new Food();
Food foo2 = new Food();
Food foo3 = new Food();

World world = new World();
world.add(foo1, ...);  //Be sure to place each object in a distinct position so you can see each one.
world.add(foo2, ...);  
world.add(foo3, ...);

//Now delete one. 
foo1.killFood(); 

//one of th ethree should go away. 
无论如何,我认为从你们的问题来看,你们把类的实例和类本身混淆了


当然,这是假设
removeObject
起作用

我假设您的代码如下所示:

public abstract class Food {
    ...
    public void killFood () {
        getWorld().removeObject(this);
    }

    public void act() {
        if (canMove()) {
            move();
        } else { 
            killFood();
        }
    }
}

public class Cheezeburger extends Food {
    ...
}
从表面上看,这应该行得通

奶酪汉堡包不会被移除的可能原因包括:

  • 您的代码实际上没有在奶酪汉堡上调用
    act()
  • getWorld()
    返回一个与您期望的不同的世界
  • World.removeObject(…)
    工作不正常
  • Cheezburger类(或超类)已重写了
    act
    canMove
    killFood
    ,并且重写方法做了错误的事情
所有这些场景都可以概括为“bug在其他地方”



假设您已经检查了代码,但找不到问题,下一步应该是使用调试器运行它,然后单步检查不工作的代码,以查看实际发生的情况。

如果没有看到removeObject()的实现,很难告诉您为什么removeObject()会发生不起作用。你能发布“removeObject”方法的代码吗?它在上面的API链接中。。。链接:即使代码在API链接中(不是),请在问题中发布相关代码,以方便回答的人。为什么在“世界”级API中看不到此方法摘要?此外,我还为我编写的名为“蘑菇”的扩展类添加了一个示例,蘑菇(从中创建对象时)根本不会消失。。。我真的对这个问题感到绝望,因为“在纸上”它应该是有效的,但实际上它没有……所以你说getWorld().removeObject(this);与“this”一起使用是否合法?如果它是一个图形界面,那么当我使用killFood()时,为什么食物中固有的东西没有死亡?如果食物接触地面,那么是什么?getWorld().removeObject(这个);很好。它将从你的世界中移除一个特定的食物实例。我不知道你为什么认为食物中遗传的东西会死亡。也许继承并不意味着你认为它是什么?现在我也理解你了,那么现在你能修复我的代码(通过编辑你的代码,上面)并告诉我如何修复它,以确保从食物固有的类中创建的每个对象在落地时都会死亡吗?为了理解它,我真的需要它…你需要在每一个例子中调用killFood。所以,食物2.杀手食物,食物3.杀手食物。等等……但问题是,我需要的是,对于任何接触地面的食物类型对象(特别是对于食物固有的未来类),都将具有这种能力,而不必在扩展食物的每个类中写入,而只需在食物本身中写入…:-(act()由接口自动调用。World.removeObject(…)已在另一个直接从Actor继承的类上进行了测试,它正在工作……奶酪汉堡风格的类确实会重写,但只在move()类上进行。因此,我们只关注可能的“getWorld()将不同的世界返回到您期望的世界”.你能再次检查我编辑的代码并帮我找到我的吗?thnx;-)@Master C-你发布的额外代码似乎没有任何问题。。。假设
canMove
逻辑是正确的(我无法判断),我从从从Act继承的其他类复制了canMove()方法
public abstract class Food {
    ...
    public void killFood () {
        getWorld().removeObject(this);
    }

    public void act() {
        if (canMove()) {
            move();
        } else { 
            killFood();
        }
    }
}

public class Cheezeburger extends Food {
    ...
}