Java: Как изменить значение закрытой переменной, не используя метод установки из другого класса? - PullRequest
0 голосов
/ 02 мая 2018

Над первым оператором печати я понимаю, что создаю новую «коробку» под названием player, в которой я устанавливаю значение здоровья равным 50. (Игнорируя Берта и нож). Таким образом, значение здоровья, потому что оно находится в диапазоне от 0 до 100, меняется на 50. Над вторым оператором печати я использую ключевое слово «новый», поэтому я создаю новый «ящик», также называемый игроком, и «переопределяю» поле первого игрока. "и попробуйте передать значение здоровья 200, но 200 не между 0-100, поэтому значение по умолчанию установлено равным 100. То, что я пытаюсь достичь без использования метода сеттера в моем классе PlayerNoLeaks, это" быть в том же поле ", так что значение, которое я сначала передаю, равно 50, поэтому здоровье = 50, затем попробуйте передать 200, но не может иметь значение от 0 до 100, поэтому значение остается равным 50. Если я выберу значение по умолчанию 100 в PlayerNoLeaks, то значение 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 голосов
/ 03 мая 2018

Когда вы снова вызываете new для того же объекта, он удаляет старый «playerNoLeaks» и заменяет его. Как будто ты никогда не создавал это. Вы должны использовать сеттеры, чтобы делать то, что вы хотите.

0 голосов
/ 03 мая 2018

Ниже приведены два разных PlayerNoLeaks экземпляра объекта. Они не имеют одинаковые значения здоровья.

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

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

Вы не можете ожидать, что Алма будет отражать свое здоровье, основываясь на Берте.

Что вы действительно хотите узнать и решить из этого?

В каком случае пользователь хотел бы, чтобы игрок Алмы отражал здоровье Берта?

Дайте нам знать, чего вы действительно хотите достичь, чтобы мы могли дать вам лучший ответ.

0 голосов
/ 02 мая 2018

Вы можете использовать Java Reflection API для этого. Пример кода см. http://tutorials.jenkov.com/java-reflection/fields.html#getset

Если это личное, вам может потребоваться установить field.setAccessible (true) .

...