Java,clone()问题?

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

对不起,我的基本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 = 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
inside
test()
设置为
矩阵的新实例。原始矩阵没有改变。@Phylogenesis:如何编写正确的赋值B=a?在调用代码中,使用
B=a.copy()。不要尝试在实例方法中执行此操作。
B
inside
test()
设置为
Matrix
的新实例。原始矩阵没有改变。@系统发育:如何编写正确的as