Java 从其他类访问子类方法

Java 从其他类访问子类方法,java,object,arraylist,subclass,extend,Java,Object,Arraylist,Subclass,Extend,所以我在做一个纸牌游戏 在我的main中有一个类型为player的arrayList,我用某种类型的player填充了它(在本例中,一个好的player-一个好的player是player的一个子类,有几个附加的方法) 我可能只是因为看了太长时间而脑死亡,但这是我的代码 我创造了4名优秀球员-再次-优秀球员扩展球员 ArrayList<Player> players = new ArrayList<>(); for (int i = 0; i < 4; i+

所以我在做一个纸牌游戏

在我的main中有一个类型为player的arrayList,我用某种类型的player填充了它(在本例中,一个好的player-一个好的player是player的一个子类,有几个附加的方法)

我可能只是因为看了太长时间而脑死亡,但这是我的代码

我创造了4名优秀球员-再次-优秀球员扩展球员

ArrayList<Player> players = new ArrayList<>();
    for (int i = 0; i < 4; i++) 
    {
                    goodPlayer gp = new goodPlayer();
                    players.add(gp); 
     }
我做错了什么,因为我目前拥有的是不正确的,除非我将count设置为静态并调用goodPlayer.count,但是我不希望类在静态上下文中运行。
谢谢。

为什么不使用类型转换?您不需要将count方法设置为静态方法来使用它。如果您100%确定该列表中的所有玩家都来自GoodPlayer类(按照惯例,类名以大写开头),那么只需将其转换为

((GoodPlayer) player).count();
如果您不确定是否所有玩家都来自GoodPlayer类,请添加测试以避免运行时错误:

if (player instanceof GoodPlayer) {
     ((GoodPlayer) player).count();
}

如果您的玩家列表总是包含GoodPlayer对象,那么最好将其作为GoodPlayer列表


否则,用户给出的答案最适合您的目的。

虽然您提供的信息似乎有点抽象,但您可以通过以下方式进行操作(使用向下广播,但不推荐):


解决方案是在抽象播放器类上添加一个方法,并在派生的播放器类型中以不同的方式实现。例如:

public abstract class Player
{
    public abstract int count();
}

public class GoodPlayer extends Player
{
  public int count()  
  {
    return totalHandsPlayed * 3; //Or something meaningful;
  }

}

本例显示的是您有一个基类,它要求任何继承的类实现定义为抽象的方法。(在本例中为计数)。

请遵循Java命名约定。它使Java开发人员能够阅读您的代码,但最重要的是,它使StackOverflow上的语法高亮显示工作起来。在您的情况下,类名应该以大写字母开头,然后是大小写。所以
class-goodPlayer
应该变成
class-goodPlayer
for(Player p:players){
            GoodPlayer gp=(GoodPlayer)p;
            gp.count();
        }
public abstract class Player
{
    public abstract int count();
}

public class GoodPlayer extends Player
{
  public int count()  
  {
    return totalHandsPlayed * 3; //Or something meaningful;
  }

}