【问题标题】:How to change object value from another class in Java (look like same as Arraylist)? [duplicate]如何从 Java 中的另一个类更改对象值(看起来与 Arraylist 相同)? [复制]
【发布时间】:2021-07-18 20:23:21
【问题描述】:

我对 ArrayList 与另一个可以更改另一个类的值的变量感到困惑。 我有两个类和两个带有ArrayListObject 变量的示例。 有人可以帮助我理解为什么它会有所不同,以及是否有解决方案使其具有相同的效果?

这是 ArrayList 的代码:

import java.util.List;

public class Test {
    private String name = "Fifi";
    
    void fill(List<Test> a) {
        a.add(this);
    }
}
import java.util.ArrayList;
import java.util.List;

public class B {
    private List<Test> a = new ArrayList<Test>();
    //a variable is empty

    public B() {
        // TODO Auto-generated constructor stub
        Test oa = new Test();
        oa.fill(a);// After this method is called, a variable has change with name is "FiFi"
    }

    public static void main(String[] args) {
        new B();
    }
}

然后,我和object变量有同样的形式,但结果不一样。

public class Test {
    private String name = "Fifi";
    
    void fill(Test b) {
        b = this;
    }
}
public class B {
    private Test a;
    // so a variable is null

    public B() {
        // TODO Auto-generated constructor stub
        Test oa = new Test();
        oa.fill(a);// after fill method is called, a still null!
    }

    public static void main(String[] args) {
        new B();
    }
}

与上面的 Arraylist 和对象变量有什么不同?我不明白它是如何发生的!

【问题讨论】:

  • 在您的第一个示例中,您从不使用您创建的私有 List,而只是在方法退出时丢弃的新本地列表。
  • @NomadMaker 用于添加Test类的实例,请仔细检查
  • @eis 是的,你是对的。对不起。

标签: java class object arraylist


【解决方案1】:

ArrayListObject 是两个完全不同的概念。 ArraylistObject

oa.fill(a); // 调用fill方法后,还是null!

a 为空,因为这个

私人测试a;

不是对象,而是Test 类的引用。所以没有内存分配给aDifference between declaration and instantiation

private Test a = new Test(); //object is created

你的两个代码之间的区别:

此代码将Test 类的对象(oa) 附加到列表a-

public class Test {
    private String name = "Fifi";
    
    void fill(List<Test> a) {
        a.add(this);
    }
}

在这段代码中,您将一个对象(oa)的内容分配给同一类Test的另一个对象(a)-

    public B() {
        Test oa = new Test();
        oa.fill(a);
        System.out.print(a.name); //output: Fifi
    }

【讨论】:

  • 即使private Test a; 是一个对象,例如private Test a = new Test();,它也不会改变任何东西。 OP 尝试的代码仍然不起作用,因为分配给作为值传递的引用不起作用。您需要使用参考作为参考。
  • @eis 你运行代码了吗?您能否在运行此代码后澄清您的观点,因为您在第一行中所说的内容与输出不一致。如果您说的是真的,那么a.name 的值在oa.fill(a) 之后如何更改为“Fifi”
  • 无论是否创建新对象,它都不会改变。它只会在使用 List 时改变,而不是在使用 Test 时改变。这是由于我解释的参考用法。
  • @eis 它随着新对象的创建而改变,这就是我要求你执行代码的原因。
  • 我不确定你是否理解这个问题。这是一个可运行的演示,表明它不会改变:ideone.com/1LNzAw
猜你喜欢
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2017-07-24
  • 2013-12-29
  • 2021-08-14
相关资源
最近更新 更多