gpt4 book ai didi

java - 传递给 java 中方法的对象适用于原始副本

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

我有一个带有一个字段的Sample类,我正在做以下事情:

  1. 以此类的对象作为参数调用方法。
  2. 对此对象进行一些操作。
  3. 原来的对象毕竟改变了。

我正在使用 BigInteger 类对象做同样的事情,但它的工作方式不同。为什么会这样?

我的类(class):

public class Sample {
private int number;

public int getNumber(){
return number;
}

public void setNumber(int number){
this.number = number;
}

public Sample add(int number){
this.number += number;
return this;
}
}

调用:

public class Main {

public static void main(String[] args) {
Main m = new Main();
BigInteger b1 = new BigInteger("5");
Sample s1 = new Sample();
s1.setNumber(3);
System.out.println(s1.getNumber());
Sample s2 = m.checkSample(s1);
BigInteger b2 = m.checkBig(b1);
System.out.println(s1.getNumber()+" "+s2.getNumber());
System.out.println(b1.toString()+" "+b2.toString());


}
public Sample checkSample(Sample k){
k = k.add(5);
return k;
}
public BigInteger checkBig(BigInteger big){
big = big.add(new BigInteger("2"));
return big;
}
}

输出:

3
8 8
5 7

最佳答案

您没有对 BigInteger 执行相同的操作 - 您正在调用 add 方法,该方法返回对 new 的引用BigInteger,并且您将该值分配回 big

您的 Sample.add 方法会更改现有对象:

public Sample add(int number){
this.number += number;
return this;
}

如果您将其更改为返回对新对象的引用,则其行为将类似于 BigInteger:

public Sample add(int number){
Sample sample = new Sample();
sample.setNumber(sample.number + number);
return sample;
}

但是,与 BigInteger 不同,您的 Sample 类目前基本上是可变的。对 BigInteger 的任何操作都不会更改现有对象的状态;相反,它们创建新的对象。如果您想在 Sample 中复制该行为,您可以这样编写:

public final class Sample {
private final int number;

public Sample(int number) {
this.number = number;
}

public int getNumber(){
return number;
}

public Sample add(int number){
return new Sample(this.number + number);
}
}

重要的是要了解,您永远不会在 Java 中传递对象 - 仅引用用于导航到对象。例如:

StringBuilder a = new StringBuilder();
StringBuilder b = a;
b.append("hello");
System.out.println(a); // Prints hello

这里有一个单个 StringBuilder 对象,但两个变量(ab)都有引用的值到同一个对象。通过一个变量所做的任何更改仍然可以通过另一个变量看到。 (有关更多信息,请参阅 this Stack Overflow answer。)

关于java - 传递给 java 中方法的对象适用于原始副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20867912/

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