所以我仍在努力了解如何创建采用不同副本并返回em的方法。这是下面的问题,下面是我的尝试。
编写一个方法,该方法将对StringBuffer对象数组的引用作为参数,并返回该参数数组的引用,浅表和深表副本。请注意,并非数组的每个位置都将引用StringBuffer对象,有些可能为null。
public static void main(String[] args) {
// TODO Auto-generated method stub
//probOne();
StringBuffer[] abc = new StringBuffer[]{new StringBuffer("Anakin"),new StringBuffer("Luke"),new StringBuffer("Ben")};
System.out.println(abc);
StringBuffer[] cba = refCopy(abc);
System.out.println(cba);
cba = shalCopy(abc);
System.out.println(cba);
cba = deepCopy(abc);
System.out.println(cba);
}
public static StringBuffer[] refCopy(StringBuffer[] sa)
{
StringBuffer[] sb = sa;
return sb;
}
public static StringBuffer[] shalCopy(StringBuffer[] sa)
{
StringBuffer[] copy = new StringBuffer[sa.length];
copy=sa;
return copy;
}
public static StringBuffer[] deepCopy(StringBuffer[] sa)
{
StringBuffer[] copy = new StringBuffer[sa.length];
for (int i = 0; i < copy.length; i++) {
copy[i] = sa[i];
}
return copy;
}
编辑1:我更改了深层复制方法
public static StringBuffer[] deepCopy(StringBuffer[] sa)
{
StringBuffer[] copy = new StringBuffer[sa.length];
for (int i = 0; i < copy.length; i++) {
copy[i] = new StringBuffer(sa[i]);
}
return copy;
}
答案 0 :(得分:2)
假设您有这个课程:
class B {
int b;
B(int val) { // constructor
b = val;
}
}
class A {
B a;
}
最简单的方法,基本上是在更改一个对象时又在另一个对象上更改的地方。
A orig = new A();
A copy = orig;
copy.a = new B(5); // now orig's a variable is also a B object with value 5
第二个最简单的方法是创建一个新对象,将字段复制为参考副本。
A orig = new A();
A.a = new B(5); // random value
A copy = new A();
copy.a = orig.a; // copy the b variable by reference
copy.a.b = 5; // affects orig's b variable.
不通过引用复制所有变量。
A orig = new A();
A.a = new B(5); // random value
A copy = new A();
copy.a = new B(orig.a.b); // copy the b variable not by reference
copy.a.b = 5; // doesn't affect orig's b variable.