如果在一个合成中,如何从另一个类中正确调用java中的方法?

时间:2017-02-14 18:23:20

标签: java

为了清楚地说明这个问题,我在一个例子中展示了它。

我有一个名为Player的简单类,它包含三个数据成员("攻击"这在这里很重要),并为它们设置了setter和getter。 (现在只有setAttack()才有意义)。 我有一个" Team"一些将包含三个Player对象的类 对玩家的操作'领域。另外,Team类有一个名为increaseattack()的简单方法,它会使特定的玩家攻击增加1 Team对象通过其构造函数创建时调用)。 在Match类中,我创建了3个玩家对象,以及由这些对象创建的团队对象。现在好玩的开始了:在Team类中为指定的玩家调用setAttack()也会改变最初创建的玩家在Match类中的攻击!

我知道我对某种基本概念有误,但不知道它是如何正确完成的。你能解释一下,为什么这样的工作呢? 以下是三个类的来源:

public class Player {
  String name;
  int attack;
  int defense;

public Player(String name, int attack, int defense){
    this.name = name;
    this.attack = attack;
    this.defense = defense;
}

public int getAttack() {
    return attack;
}
public void setAttack(int attack) {
    this.attack = attack;
}
public int getDefense() {
    return defense;
}
public void setDefense(int defense) {
    this.defense = defense;
}
}


public class Team {
   private Player player1;
   private Player player2;
   private Player player3;

public Team(Player p1, Player p2, Player p3){
    this.player1 = p1;
    this.player2 = p2;
    this.player3 = p3;
    increaseattack(player1);
}

public void increaseattack(Player pla){
    pla.setAttack(pla.getAttack()+1);
}

}


public class Match {
 Player player, player2, player3;
 Team team, team1;
//static Player player, player2, player3;
//static Team team, team1;

public static void main(String[] args){
    new Match();
}

public Match(){
    test();
}


public void test() {
    player = new Player("Alan", 10, 10);
    player2 = new Player("Bob", 10, 12);
    player3 = new Player("Cedric", 13, 10);
    team = new Team(player,player2,player3);  // Creating the team instance based on player instances created here, OK 10+1 = 11
    team1 = new Team(player,player2,player3);  // new team, hopefully i get the same results, but thats not the case, 11 is base attack, not 10!!!
    System.out.println("------------------------");
    System.out.println(" " + player.getName() + " " + player.getAttack() + " " + player.getDefense());
    System.out.println(" " + player2.getName() + " " + player2.getAttack() + " " + player2.getDefense());
    System.out.println(" " + player3.getName() + " " + player3.getAttack() + " " + player3.getDefense());


}

}

这是输出:

------------------------
Alan 12 10
Bob 10 12
Cedric 13 10

这对我来说不正确,因为我预计艾伦的原始攻击没有改变,只有"在"团队。我感谢任何帮助。谢谢。

4 个答案:

答案 0 :(得分:0)

而不是这样做:

public void increaseattack(Player pla){
    pla.setAttack(pla.getAttack()+1);
}

在PLayer类中定义一个方法并直接执行操作......

public void increaseAttack() {
    this.attack++;
}

答案 1 :(得分:0)

你应该重新审视你的计划。 您的团队构造者正在为第一个参数添加“攻击”。

public Team(Player p1, Player p2, Player p3){
this.player1 = p1;
//this.player2 = p2;
//this.player3 = p3;
increaseattack(player1);

这就是为什么阿兰斯的攻击会增加。

答案 2 :(得分:0)

你创建一个攻击力为10的玩家:

player = new Player("Alan", 10, 10);

然后将该玩家添加到两个团队中:

team = new Team(player,player2,player3);
team1 = new Team(player,player2,player3);

Team的构造函数会发生什么?:

this.player1 = p1;
//...
increaseattack(player1);

increaseattack()做了什么?:

pla.setAttack(pla.getAttack()+1);

因此,Alan的攻击值从原来的10变为新值12,因为最后一次操作是对它执行两次,每次为他添加的团队执行一次。

修改:根据您的评论,听起来您想要做的不是向播放器询问他们的攻击是什么,因为团队给定玩家的攻击是什么。这是因为"攻击修饰符"在"第一"播放器是团队数据元素,而不是播放器数据元素。

所以也许在Team课程上你可能有类似的东西:

public int getAttackFor(Player player) {
    if (player == player1) {
        return player.getAttack() + 1;
    }
    if ((player == player2) || (player == player3)) {
        return player.getAttack();
    }
    // throw an exception if the player isn't found?
}

这只是一个快速自由的想法,您可以根据自己的需要进行调整。也许比较基于玩家标识符而不是直接对象参考比较,可能将玩家放入数组而不是与个别变量进行比较等。但这个想法将是:

  1. 提供Player并要求该玩家对该团队的攻击 (因为它显然可能与玩家单独的攻击不同)
  2. 确定Player是否会导致"已修改"攻击
  3. 返回针对该团队的Player 的攻击
  4. 然后使用它,你在main()中做了类似的事情:

    System.out.println(" " + player.getName() + " " + team.getAttackFor(player) + " " + player.getDefense());
    

答案 3 :(得分:0)

test()方法中,您可以使用指定的值创建三个 Player 对象。

然后,您创建一个团队对象,传递这三个播放器对象。

团队对象的播放器变量指向原始的Player对象。 (您只是使用不同的变量名称来引用相同的对象)

因此,团队对象可以更改属于Player对象的成员的值。 在你的情况下传递:

"Alan", 10, 10
"Bob", 10, 12
"Cedric", 13, 10

到团队对象将Alan的攻击值改为11。

所以,新值是:

"Alan", 11, 10
"Bob", 10, 12
"Cedric", 13, 10

然后创建另一个Team对象“team1”,传递这些相同的Player对象。 艾伦的攻击值再次增加。所以新值是:

"Alan", 12, 10
"Bob", 10, 12
"Cedric", 13, 10

因此你的输出。

阅读本文以获取更多信息:link