我对Java
有点新意,所以我有一个相当愚蠢的问题:是否有可能在超类中拥有和使用子类的对象,它们也有构造函数?
以下是我想要做的一个例子:我有超类Team
和子类Player
。我想创建Player
对象,其中包含name
,surname
,height
等变量。我希望访问Player
类中的Team
对象,其中包含它的名称,位置和其他变量,以将Player
对象分配给他在{Team
中的位置1}}。可以说,Player: John Doe
位于名为Team
的{{1}}中,他是Red
。
总之,是否可以在Goalkeeper
函数中访问所有这些内容?例如,我想打印出所有Team Red的球员名字。
抱歉,解释我想要做的事情有点复杂,但这不是必须对main
做些什么吗?
答案 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
时,我怀疑你的逻辑和设计,这基本上说Player
是Team
。这意味着每个Player
对象都有一个播放器和位置列表(因为子类型继承了非私有状态和超类型的行为),这在语义上没有多大意义。
我建议你改为接近它。
public class Team{
public LinkedList<Player> players;
}
class Player{
public Position position; // Use some way of defining the player's position.
}
这意味着Team
将Player
,而Player
为Team
答案 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
。“Player
是Team
”不会很有意义)
class Player {
String name;
String surname;
String height;
}
class Team {
String name;
List<Player> players;
}
答案 4 :(得分:1)
当我们考虑球队和球员时,其关系是球队有球员。 在设计类时使用相同的关系。 职位是与玩家范围相关的财产。所以在正确的水平上引入该属性。最好保持Team类具有自己的属性。