Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何在不使用其他类的setter方法的情况下更改私有变量的值?_Java_Encapsulation_Getter Setter - Fatal编程技术网

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

Java:如何在不使用其他类的setter方法的情况下更改私有变量的值?,java,encapsulation,getter-setter,Java,Encapsulation,Getter Setter,在第一个print语句上面,我知道我创建了一个名为player的新“框”,其中我将health的值设置为50。(忽略伯特和小刀)。因此,由于健康值介于0-100之间,因此它的值将更改为50。在第二个print语句上方,我使用关键字“new”,然后创建一个新的“box”,也称为player,并“覆盖”第一个player“box”,尝试传递健康值200,但200不在0-100之间,因此默认值设置为100。在我的PlayerOleaks类中,如果不使用setter方法,我试图实现的是“在同一个框中”,

在第一个print语句上面,我知道我创建了一个名为player的新“框”,其中我将health的值设置为50。(忽略伯特和小刀)。因此,由于健康值介于0-100之间,因此它的值将更改为50。在第二个print语句上方,我使用关键字“new”,然后创建一个新的“box”,也称为player,并“覆盖”第一个player“box”,尝试传递健康值200,但200不在0-100之间,因此默认值设置为100。在我的PlayerOleaks类中,如果不使用setter方法,我试图实现的是“在同一个框中”,因此我第一次传递的值是50,因此health=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;
  }
}
公共类主{
公共静态void main(字符串[]args){
PlayerNoLeaks player=新的PlayerNoLeaks(“伯特”,50,“刀”);
System.out.println(“初始运行状况为”+player.getHealth());//打印50
player=newplayernoleaks(“Alma”,200,“剑”);//打印100
System.out.println(player.getHealth());
}
}
公营游乐场{
私有字符串名称;
private int health=100;//默认值
私人弦武器;
公共玩家角色(字符串名称、整数生命值、字符串武器){
this.name=名称;

如果(health>0&&health,您可以使用Java反射API来实现这一点


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

在同一对象上再次调用new时,它会删除旧的“playerNoLeaks”并替换它。就像您从未创建过它一样。您需要使用setter来执行您想要的操作。

下面是两个不同的
PlayerNoLeaks
对象实例。它们不共享相同的运行状况值

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

new PlayerNoLeaks("Alma", 200, "Sword"); //Second Player called Alma
你不能指望阿尔玛根据伯特来反映他的健康状况

你真正想从中学习和解决的是什么

在哪种情况下,您希望Alma player反映Bert的健康状况


让我们知道您真正想要实现的目标,这样我们可能会给您更好的答案。

“我不使用setter方法试图实现的目标”-为什么?因为我想学习如何在没有setter方法@JacobG的情况下实现它。虽然这通常是一种非常糟糕的做法,但如果出于某种原因确实需要,您可以使用反射来实现。如果不解释原因,您将得不到很好的建议。请参阅。虽然这当然是一个有效的问题,因为堆栈溢出的规则是有限的诚然,我强烈建议您对这个问题进行第二、第三和第四次思考。这种方法所能做的就是在重构(或bug)时使类之间的依赖关系更加难以发现出现了。所以你当然不应该在任何人都依赖的实时生产系统中做任何这样的事情。更不用说它比简单地编写一个setter慢得多。从技术上讲,setter方法是一个隐私泄露问题吗?你正在封装数据,例如,在这种情况下,你想使用setter。但是,你不需要d需要一个getter。这样做比将变量公开要好得多。您可以在此处阅读更多内容: