Java,clone()问题?
对不起,我的基本Java问题。下面是一节课Java,clone()问题?,java,reference,copy,clone,Java,Reference,Copy,Clone,对不起,我的基本Java问题。下面是一节课 public class Matrix { public final double[][] items; private final int rows_count, columns_count; public Matrix( final int rows_count_, final int columns_count_) { rows_count = rows_count_; columns_count
public class Matrix {
public final double[][] items;
private final int rows_count, columns_count;
public Matrix( final int rows_count_, final int columns_count_) {
rows_count = rows_count_; columns_count = columns_count_;
items = new double[rows_count][columns_count];
}
public Matrix(final double[][] data) {
rows_count = data.length;
columns_count = data[0].length;
items = new double[rows_count][columns_count];
for (int i = 0; i < rows_count; i++)
for (int j = 0; j < columns_count; j++)
}
public Matrix copy () {
Matrix AC = new Matrix(rows_count, columns_count);
for (int i = 0; i < rows_count; i++)
for (int j = 0; j < columns_count; j++)
AC.items[i][j] = items[i][j];
return AC;
}
public Matrix clone () { return this.copy }
public void test (Matrix B) {
B = this.clone();
B.items[0][0] = 1;
}
召唤
double[][] d = { { 1, 2, 3 }, { 4, 5, 6 }, { 1, 0, 1} };
Matrix A = new Matrix(d);
Matrix B= new Matrix(3,3);
A.test(B);
B.print();
结果令人惊讶。尽管
B = this.clone()
由此产生的B矩阵为零
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
看起来B是通过值传递的:-)重写test(),以便
矩阵B已正确修改
1.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
问题出在哪里?复制/克隆方法可能写得不正确?如何解决问题并执行赋值B=A?感谢您的帮助。问题是,
clone
返回一个新实例,然后对其进行修改。B
中的Matrix
实例根本不被触及。为函数的参数指定新值不会更改传递的变量,并且在函数返回后,所有更改都将丢失。您必须更改传递的对象,而不是保存它的变量,才能将更改归档到函数之外
要更改B
,您可以将test
方法更改为返回B
,然后在外部重新签名(这将使传递无效)
另一种方法是创建一个复制
函数,将矩阵
作为参数,然后用新日期更新它(不创建新的矩阵
)。旧的copy
甚至可以通过先创建一个新矩阵,然后将其传递给新的copy
来使用这个新函数
<>编辑:关于C++和指针的注释:在C++(和许多其他语言)中,你可以把指针传递给函数。如果这样做,重新签名实际上会在函数外部更改传递的变量。在Java中,这样做是不可能的(据我所知)。您可以在中找到有关此主题的更多信息问题是,
clone
返回一个新实例,然后对其进行修改。B
中的Matrix
实例根本不被触及。为函数的参数指定新值不会更改传递的变量,并且在函数返回后,所有更改都将丢失。您必须更改传递的对象,而不是保存它的变量,才能将更改归档到函数之外
要更改B
,您可以将test
方法更改为返回B
,然后在外部重新签名(这将使传递无效)
另一种方法是创建一个复制
函数,将矩阵
作为参数,然后用新日期更新它(不创建新的矩阵
)。旧的copy
甚至可以通过先创建一个新矩阵,然后将其传递给新的copy
来使用这个新函数
<>编辑:关于C++和指针的注释:在C++(和许多其他语言)中,你可以把指针传递给函数。如果这样做,重新签名实际上会在函数外部更改传递的变量。在Java中,这样做是不可能的(据我所知)。您可以在中找到有关此主题的更多信息。有一个对象的方法
类
。您可以在不覆盖它的情况下使用它。为了能够使用它,您需要确保类实现了
有一个对象
类
的方法。您可以在不覆盖它的情况下使用它。为了能够使用它,您需要确保类实现了
test()方法的问题在于它不返回任何对象,因此不会在方法之外进行任何更改
公共空隙试验(矩阵B)
在本例中,B是一个局部变量,这意味着它的生存期从启动方法开始,到方法完成时结束。Java是CallByValue,而不是CallByReference,这意味着您不会在方法中传递实际的对象引用,而是传递一个具有相同值的新引用,如副本
B=this.clone()强>
尽管您将A的克隆指定给B,但B仍然仅在该方法中可用,并且不会影响传递到该方法中的B的实例
B.项目[0][0]=1强>
//您仍然只是更改B的内部(局部)变量,而不是B的原始实例。由于您不返回B,因此此方法中的所有更改都已过时,B将被丢弃
要使您的方法发挥作用,您应该这样设计:
Public Matrix test(Matrix B){
B = this.clone();
B.items[0][0] = 1;
return B;
}
double[][] d = { {1,2,3},{4,5,6},{1,0,1}};
Matrix A = new Matrix(d);
Matrix B = new Matrix(3,3);
Matrix B = A.test(B);
B.print();
然后您需要将此方法的调用再次分配给B,如下所示:
Public Matrix test(Matrix B){
B = this.clone();
B.items[0][0] = 1;
return B;
}
double[][] d = { {1,2,3},{4,5,6},{1,0,1}};
Matrix A = new Matrix(d);
Matrix B = new Matrix(3,3);
Matrix B = A.test(B);
B.print();
test()方法的问题在于它不返回任何对象,因此不会在方法之外进行任何更改
公共空隙试验(矩阵B)
在本例中,B是一个局部变量,这意味着它的生存期从启动方法开始,到方法完成时结束。Java是CallByValue,而不是CallByReference,这意味着您不会在方法中传递实际的对象引用,而是传递一个具有相同值的新引用,如副本
B=this.clone()强>
尽管您将A的克隆指定给B,但B仍然仅在该方法中可用,并且不会影响传递到该方法中的B的实例
B.项目[0][0]=1强>
//您仍然只是更改B的内部(局部)变量,而不是B的原始实例。由于您不返回B,因此此方法中的所有更改都已过时,B将被丢弃
要使您的方法发挥作用,您应该这样设计:
Public Matrix test(Matrix B){
B = this.clone();
B.items[0][0] = 1;
return B;
}
double[][] d = { {1,2,3},{4,5,6},{1,0,1}};
Matrix A = new Matrix(d);
Matrix B = new Matrix(3,3);
Matrix B = A.test(B);
B.print();
然后您需要将此方法的调用再次分配给B,如下所示:
Public Matrix test(Matrix B){
B = this.clone();
B.items[0][0] = 1;
return B;
}
double[][] d = { {1,2,3},{4,5,6},{1,0,1}};
Matrix A = new Matrix(d);
Matrix B = new Matrix(3,3);
Matrix B = A.test(B);
B.print();
B
insidetest()
设置为矩阵的新实例。原始矩阵没有改变。@Phylogenesis:如何编写正确的赋值B=a?在调用代码中,使用B=a.copy()代码>。不要尝试在实例方法中执行此操作。B
insidetest()
设置为Matrix
的新实例。原始矩阵没有改变。@系统发育:如何编写正确的as