列表中的Java元素未“自动更新”

列表中的Java元素未“自动更新”,java,Java,首先:我忘记了自动更新的术语,但我的意思是: int x = 5; int y = x; System.out.println(y); //Prints 5 x = 3; System.out.println(y); //Now prints 3! 请注意,任何使用此作为参考的人:上述示例在评论中指出是错误的 但是,我在一个列表中尝试了这种方法,但它不起作用,我的代码: Account.java的相关部分: public class Account extends Entity<Stri

首先:我忘记了自动更新的术语,但我的意思是:

int x = 5;
int y = x;
System.out.println(y); //Prints 5
x = 3;
System.out.println(y); //Now prints 3!
请注意,任何使用此作为参考的人:上述示例在评论中指出是错误的

但是,我在一个列表中尝试了这种方法,但它不起作用,我的代码:

Account.java的相关部分:

public class Account extends Entity<String, Account> {
    private String username;
    private String password;

    public Account(final String username, final String password) {
        this.username = username;
        this.password = password;

        key = username;
        data.add(password);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(final String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(final String password) {
        this.password = password;
    }
}

然而,我想知道,没有更好的解决办法吗?因为它现在需要三行代码,其中两行很容易被忘记。

我想你是糊涂了。此代码:

int x = 5;
int y = x;
System.out.println(y); //Prints 5
x = 3;
System.out.println(y); //Now prints 3!
。。。不会打印3。本任务:

int y = x;

。。。不将y和x变量相互关联。它只是将x的当前值复制到y中。对x的进一步更改不会反映在y中。

在您的介绍性示例中,您将其与x和y都指向同一个可变对象并更改其状态的情况相混淆:

List<String> x = new ArrayList<>();
x.add("a");
y = x;
y.add("b");
System.out.println(y); // prints [a, b]

但在setPassword中,您只有

    this.password = password;
当然,当您调用setPassword时,数据列表的内容不受其影响,这与password是基元类型还是引用类型无关

例如,每当我有此帐户=新帐户测试,1;,然后当我使用System.out.PrintLnCount.getData打印[1]时,这仍然是正确的。但是当我执行account.setPassword11;随后,System.out.PrintLnCount.getData仍会打印[1],而不是预期的[11]

你叫这个塞特:

public void setPassword(final String password) {
    this.password = password;
}
这将更改成员的密码

然后你称之为getter:

public List<Object> getData() {
    return data;
}

为什么在调用setPassword后数据会更改?

某些类型是“可变”的,因此您可以更改单个对象的值。阵列就是一个例子:

int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x[0] = 3;
System.out.println(y[0]); //Now prints 3!
与之相比:

int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x = new int[]{3};
System.out.println(y[0]); //Still prints 5!

y=x使y引用,而不是x,而是与x引用的值相同。当我给x赋值时,就像我在第二个例子中做的那样,我让x引用的对象与y现在引用的对象不同。但是,如果我像第一个例子那样更改对象本身,那么两个变量仍然引用相同的、现在已更改的对象

您需要查找对象和对象引用之间的差异,以找到混淆的根源。Java中的原语是值类型。请阅读Java官方教程。正如hoaz所说,您在第一部分编写的代码不起作用,您的初始代码没有做到您所说的。我刚查过。您的假设是错误的。添加了一个建议的答案,对此的帮助将不胜感激。我非常确定,我曾经有过变量完全如我所描述的那样发生变化的时候。。。只是我想不起一个具体的例子。你知道在Java中使用基本代码是否真的可以做到这一点吗?@Aurand Integer是不可变的,没有区别。我认为这是因为我认为密码是数据元素,因此我认为在更改Account对象中的密码时,它也会在列表对象中更改。您混淆了按引用工作的对象赋值和按值工作的原语赋值。更改密码将使其引用另一个字符串对象。它不会更改任何其他引用。是否有某种方法可以在实体数据中的帐户中为我的密码实现此目的?所以我需要将实体中数据中的密码引用到帐户中的密码。这可能吗?如果是,怎么做?
public void setPassword(final String password) {
    this.password = password;
}
public List<Object> getData() {
    return data;
}
int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x[0] = 3;
System.out.println(y[0]); //Now prints 3!
int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x = new int[]{3};
System.out.println(y[0]); //Still prints 5!