Java 如何从列表中访问子类对象的方法

Java 如何从列表中访问子类对象的方法,java,inheritance,subclass,Java,Inheritance,Subclass,我有一个类精灵和一个类士兵,坦克等等士兵和坦克扩展精灵。现在,子类有一个特殊的update()方法,在每个类中都是不同的(比如不同的移动等等) 我有一个列表单元s1player1,其中存储了士兵等的所有物体,还有一个列表单元s2 player1,其中存储了坦克的所有物体。这些列表的类型为。现在请查看以下代码: for(Iterator<Sprites> itr_unit1_player1 = ListUnits1Player1.iterator();itr_u

我有一个类
精灵
和一个类
士兵
坦克
等等<代码>士兵和
坦克
扩展
精灵
。现在,子类有一个特殊的
update()
方法,在每个类中都是不同的(比如不同的移动等等)

我有一个
列表单元s1player1
,其中存储了士兵等的所有物体,还有一个
列表单元s2 player1
,其中存储了坦克的所有物体。这些列表的类型为
。现在请查看以下代码:

        for(Iterator<Sprites> itr_unit1_player1 =     ListUnits1Player1.iterator();itr_unit1_player1.hasNext();) {
        Sprites unit1_player1 = itr_unit1_player1.next();
        unit1_player1.update();
    }
总是得到正确的类,但这只会给我错误
未知类'unitClass'


有什么建议吗

您可以将父类
Sprites
中的方法
update
作为抽象方法移动


然后子类必须重写该方法并
unit1_player1.update()
无需任何强制转换即可工作。

您可以将父类中的方法
update
作为抽象方法移动


然后子类必须重写该方法并
unit1_player1.update()
将在没有任何强制转换的情况下工作。

如果您不能在
精灵上调用
取消日期
,则表示您没有在超类中声明
更新
方法或将其声明为私有

使用
override
annotation始终是一个好习惯:

class Sprites {
    void update() {

    }
}

class Tank extends Sprites {

    @Override
    void update() {
        // ...
    }
}

如果无法在
精灵
上调用
取消日期
,则表示未在超类中声明
更新
方法或将其声明为私有

使用
override
annotation始终是一个好习惯:

class Sprites {
    void update() {

    }
}

class Tank extends Sprites {

    @Override
    void update() {
        // ...
    }
}

您在
Sprite
s上声明了一个迭代器,因此从编译器的角度来看,您可以处理该迭代器的任何子类型,但无法知道是哪一种


如果您的集合中只有支持
update
的对象,那么您应该为该方法声明一个接口,让
Soldier
Tank
实现它,然后将您的集合视为包含该接口类型的对象进行辩论。

您在
Sprite
上声明了迭代器,所以从编译器的角度来看,你可以处理它的任何子类型,但是没有办法知道是哪一种


如果您的集合中只有支持
update
的对象,您应该为该方法声明一个接口,使
Soldier
Tank
都实现它,然后讨论您的集合是否包含该接口类型的对象。

将您的
更新
方法作为抽象方法放入
精灵
类中

//superclass
public abstract void update ();
然后在每个子类中重写它

//subclass
public void update (){
    //code
}

Sprites
类中将
update
方法作为抽象

//superclass
public abstract void update ();
然后在每个子类中重写它

//subclass
public void update (){
    //code
}

下课。我猜
update()
不是
public
?update()方法应该在类Sprite中声明(可能作为抽象方法),并在子类中重写。为了使代码可读,您还应该学习正确缩进代码,并遵守Java命名约定。我猜
update()
不是
public
?update()方法应该在类Sprite中声明(可能作为抽象方法),并在子类中重写。为了使代码可读,您还应该学习正确缩进,并遵守Java命名约定。谢谢您的回答。与覆盖工程。但是在超类中将方法声明为抽象将意味着我需要将整个类声明为抽象。@Mirco哦,是的,你是对的。但那没关系,不是吗?那还可以。谢谢你的回答。与覆盖工程。但是在超类中将方法声明为抽象将意味着我需要将整个类声明为抽象。@Mirco哦,是的,你是对的。但那没关系,不是吗?那还可以。谢谢你的回答。与覆盖工程。但是在超类中将方法声明为抽象将意味着我需要将整个类声明为抽象。我同意@Sun的答案,但你的答案基本上是一样的,而且有效(没有摘要)。谢谢谢谢你的回答。与覆盖工程。但是在超类中将方法声明为抽象将意味着我需要将整个类声明为抽象。我同意@Sun的答案,但你的答案基本上是一样的,而且有效(没有摘要)。谢谢