Java:如何在不使用其他类的setter方法的情况下更改私有变量的值?

时间:2018-05-02 20:50:40

标签: java encapsulation getter-setter

在第一个印刷语句之上我理解我创建了一个名为player的新“盒子”,我将生命值设置为50.(忽略伯特和刀)。所以健康的价值因为它在0-100之间变为50.在第二个印刷语句之上,我使用关键字“new”,然后我创建一个新的“盒子”也称为播放器并“覆盖”第一个播放器“盒子” “并尝试传递200的健康值,但200不在0-100之间,因此默认值设置为100.我试图在我的PlayerNoLeaks类中使用setter方法实现的目标是”在同一个框“所以我第一次传递的值是50所以健康= 50,然后尝试传递200但不能有0-100的值,所以值仍然是50.如果我在PlayerNoLeaks中取出默认值100然后0的值打印,所以我打赌我在主类中再次使用“new”关键字有问题。

希望这是有道理的。

谢谢!

  public class Main {
  public static void main(String[] args) {

    PlayerNoLeaks player = new PlayerNoLeaks("Bert", 50, "Knife");
    System.out.println("Initial health is " + player.getHealth()); //prints 50

    player = new PlayerNoLeaks("Alma", 200, "Sword"); //prints 100
    System.out.println(player.getHealth());

    }
}

public class PlayerNoLeaks {
  private String name;
  private int health = 100; //default value
  private String weapon;

  public PlayerNoLeaks(String name, int health, String weapon) {
    this.name = name; 
    if(health > 0 && health <= 100) { 
        this.health = health;
    }
    this.weapon = weapon; 
  }

  public void loseHealth(int damage) {
    this.health -= damage;
    if(this.health <= 0) {
        System.out.println("Player knocked out!");
    }
  }
  public int getHealth() {
    return health;
  }
}

3 个答案:

答案 0 :(得分:2)

您可以使用Java Reflection API执行此操作。有关代码示例,请参阅http://tutorials.jenkov.com/java-reflection/fields.html#getset

如果它是私有的,您可能必须设置 field.setAccessible(true)

答案 1 :(得分:0)

当您在同一个对象上再次调用new时,它会删除旧的“playerNoLeaks”并替换它。这就像你从未创造过它。你需要使用setter来做你想做的事。

答案 2 :(得分:0)

下面是两个不同的PlayerNoLeaks对象实例。它们不具有相同的健康值。

new PlayerNoLeaks("Bert", 50, "Knife"); //First Player called Bert

new PlayerNoLeaks("Alma", 200, "Sword"); //Second Player called Alma

你不能指望Alma根据Bert反映他的健康状况。

你真的想学习和解决这个问题是什么?

在哪种用户情况下,您希望Alma玩家反映Bert的健康状况?

让我们知道您真正想要实现的目标,以便我们为您提供更好的答案。