gpt4 book ai didi

java - 为什么新对象保留旧对象的属性?

转载 作者:行者123 更新时间:2023-12-01 19:29:25 26 4
gpt4 key购买 nike

我创造了一种方法,可以对人们施加衰老咒语,使他们的年龄减少两倍:

public class Wizard {

void agingSpell (Person x) {
x = new Person(x.age);
x.age -=2;
}
}

这是描述这些人的类:

 public class Person {

int age;
int weight = 90;
String name = Max;

Person (int x){
this.age = x;
}
}

我创建一个PersonWizard实例:

 Person max = new Person(26);
Wizard albus = new Wizard();

然后,我将方法 agingSpell 和源 ma​​x 称为其参数:

 albus.agingSpell(Person max);

然后,据我所知,ma​​x内部的引用值被分配给方法内部的x:

Person x = max;

现在我们又多了一个对所创建对象的引用。接下来,创建一个新对象(同样,我可能是错的),并将其保存在 x 中:

      x = new Person(x.age)

我知道旧对象将被新对象替换,因此方法内必须没有旧对象的痕迹。但是,如果我编译代码,新对象的 age 也将为 26 。此外,我可以轻松访问旧对象的所有其他字段(当我们将他的 x 引用分配给另一个对象时,这些字段应该是不可访问的)。我知道我肯定错过了一些东西。请您帮我解决一下好吗?

这是代码的执行部分:

public class Wizard {

}

public static void main (String [] args){
Wizard albus = new Wizard();
Person max = new Person(26);
albus.agingSpell(max);
System.out.println(max.age);
}

}

最佳答案

您在拼写方法中重新分配x,使其指向人,然后您更改该新人的年龄,然后将该人扔掉。所以最终结果没有任何改变。与执行此操作相同:

void agingSpell(Person p) {
Person throwaway = new Person(p.age);
throwaway.age -= 2;
// when this method returns, "throwaway" literally gets thrown away.
}

一个更好的问题是“如果目的是降低一个人的年龄,为什么要产生一个新人?”。让咒语直接更新你传入的人:

class Wizard {
final int DEFAULT_AGE_DECREASE = 2;

...

void agingSpell(Person p) {
this.agePerson(p, DEFAULT_AGE_DECREASE);
}

void agingSpell(Person p, int years) {
// let's keep a person's age a protected field
p.setAge(p.age - years);

// and you'll probably need logic for age hitting/dropping below zero
}

...
}

关于java - 为什么新对象保留旧对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60215584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com