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

时间:2015-04-21 14:52:58

标签: java inheritance

我对Java有点新意,所以我有一个相当愚蠢的问题:是否有可能在超类中拥有和使用子类的对象,它们也有构造函数?

以下是我想要做的一个例子:我有超类Team和子类Player。我想创建Player对象,其中包含namesurnameheight等变量。我希望访问Player类中的Team对象,其中包含它的名称,位置和其他变量,以将Player对象分配给他在{Team中的位置1}}。可以说,Player: John Doe位于名为Team的{​​{1}}中,他是Red

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

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

5 个答案:

答案 0 :(得分:4)

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

答案越长,您就会滥用术语超类子类。您描述的关系不是 is-a 继承关系,而是具有组合关系。

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

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");
   }
}

答案 1 :(得分:1)

是的,请参阅以下代码。

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.
}

这意味着TeamPlayer,而PlayerTeam

答案 2 :(得分:1)

你必须创建3个类Team,Player&amp;用于输入数据的客户端类。 我正在为你编写骨架代码。它将为您提供如何编写代码的想法

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 
}

客户端类

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设计。

答案 3 :(得分:1)

你要找的是一个合成而不是继承(即A Team“有一个”Player。“PlayerTeam”不会很有意义)

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

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

答案 4 :(得分:1)

当我们考虑球队和球员时,其关系是球队有球员。 在设计类时使用相同的关系。 职位是与玩家范围相关的财产。所以在正确的水平上引入该属性。最好保持Team类具有自己的属性。