在Java中删除对象时出现问题
比方说一个图形世界,比方说一个世界,还有一个演员,我用演员固有的新类名Food构建了一个对象,但在某些情况下,我需要这个对象从我的世界中消失。 这样做的好方法应该是什么 我试过这个:在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
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
假设您已经检查了代码,但找不到问题,下一步应该是使用调试器运行它,然后单步检查不工作的代码,以查看实际发生的情况。如果没有看到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 {
...
}