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的答案,但你的答案基本上是一样的,而且有效(没有摘要)。谢谢