在超类对象中使用子类对象

Using subclass objects in superclass object

我对 Java 有点陌生,所以我有一个相当愚蠢的问题:是否可以在 superclass 中拥有和使用 subclass 对象哪个也有构造函数?

这是我想要做的一个例子:我有 Superclass Team 和 subclass Player。我想创建 Player 对象,其中包含 namesurnameheight 等变量。我想访问 Team class 中的这个 Player 对象,它有它的名称、位置和其他变量,以将 Player 对象分配到他在 Team。比方说,Player: John DoeTeam 中,名为 Red,他是 Goalkeeper

总而言之,是否可以在 main 函数中访问所有这些内容?例如我想打印出所有红队球员的名字。

抱歉,解释我想做的事情有点复杂,但这不是必须与 extends 做些什么吗?

是的,请看下面的代码。

public class Team{
  public Player player;
}

class Player extends Team{
  public Team team;
}

不过,当你说 Player 扩展 Team 时,我怀疑你的逻辑和设计,这实际上是说 PlayerTeam。这意味着每个 Player 对象都会有一个玩家和位置列表(因为子类型从超类型继承非私有状态和行为),这在语义上没有多大意义。

我建议您改为像下面这样处理它。

public class Team{
    public LinkedList<Player> players;
}

class Player{
    public Position position; // Use some way of defining the player's position.
}

这意味着 Team 会有 Player,而不是 PlayerTeam

简短的回答是,是的,这是可能的。

较长的答案是您误用了术语 superclasssubclass。你描述的关系不是is-a的继承关系,而是has-a的组合关系。

换句话说,您的 Player class 不会扩展您的 Team class。您的团队 class 将包含 Player 的实例。是的,在这种情况下,您的团队 class 可以访问这些实例的方法和变量,就像您可以访问任何其他 Java class 一样。它可能看起来像这样:

class Team{
   List<Player> players = new ArrayList<Player>();

   public void addPlayer(Player p, String position){
      p.position = position;
      players.add(p);
   }
}

然后从 main() 方法中,您可以执行如下操作:

public class Main{
   public static void main(String... args){
      Team team = new Team("Fighting Cats");
      Player p = new Player("Johnny Appleseed");
      team.addPlayer(p, "Apple Picker");
   }
}

您必须创建 3 个 classes 团队、玩家和一个客户 class 来输入数据。 我正在为您编写框架代码。它会让您了解如何编写代码

public class Team {

    ArrayList<Player> player;

    public ArrayList<Player> getPlayer() {
        return player;
    }

    public void setPlayer(ArrayList<Player> player) {
        this.player = player;
    }
}

玩家

class Player{

    String name;
    Integer score;
    Integer Rank;

 //getter setters 
}

客户class

public class Client {

    public static void main(String[] args) {

        Player pOne = new Player();
        pOne.setRank(2);
        pOne.setName("ABD");

        Player pTwo=new Player();
        pTwo.setRank(2);
        pTwo.setName("SPC");
        pTwo.setTotal(60);

        ArrayList<Player> playerList = new ArrayList<Player>();
        playerList.add(pOne);
        playerList.add(pTwo);

        Team team=new Team();
        one.setPlayer(playerListOne);

//get the player using Team class's getPlayer method & print
}

您无需使用 extends,而是专注于 OO 设计。

你要找的是组合而不是继承(即 Team "has a" Player。"A Player is a Team" 没有多大意义)

class Player {
    String name;
    String surname;
    String height;
}

class Team {
    String name;
    List<Player> players;
}

当我们考虑球队和球员时,它的关系是球队有球员。 在设计 classes 时使用相同的关系。 Position 是 属性 ,与 Player 的范围相关。所以在正确的级别引入 属性。最好让团队 class 拥有自己的属性。