变量在传递到函数时更改其值
问题描述:
我对Java很新,我不明白为什么变量“A”的值在作为参数传递给函数时发生更改。我确实改变了它在函数中的值,但我认为这不应该是一个问题,因为该函数会创建它自己的参数“副本”。 我的项目由一个主函数和一个类组成,其中我的函数被声明和实现,如下所示。变量在传递到函数时更改其值
package NewtonRapson;
public class Main {
public static void main(String[] args) {
division2 d2 = new division2();
double A[] = {1, -2, 0, 7};
double B[] = {0,1,1};
double D[];
double res = 0;
d2.imprimir(A);
res = d2.p_eval (A, 0.707);
System.out.println();
System.out.println(res);
d2.p_div(A,B);
d2.imprimir(A);
res = d2.p_eval (A, 0.707);
System.out.println();
System.out.println(res);
}
}
`
package NewtonRapson;
public class division2 {
int grado(double A[]){
int grado = A.length -1;
int cont = 0;
for (int i = (A.length - 1); i>= 0; i--){
if (A[i] != 0){break;}
if (A[i] == 0){ cont++; }
}
return grado - cont;
}
double [] incrementar_grado(double A[], int k){
double r[] = new double[A.length];
for (int i = 0; i < A.length; i++){
r[i] = 0;
}
for (int i = 0; i < A.length; i++){
if (i+k < A.length){
r[i+k] = A[i];
}
}
return r;
}
double [] p_div(double A[], double B[]){
double cte;
double C[] = new double[A.length];
while (grado(A) >= grado(B)){
for(int i = 0; i < C.length; i++){
C[i] = 0;
}
cte = A[grado(A)]/B[grado(B)];
for(int i = 0; i < C.length; i++){
if(i >= B.length) break;
C[i] = -cte*B[i];
}
for(int i = 0; i < C.length; i++){
if (grado (A) > grado (C)){
C = incrementar_grado(C, grado(A)-grado(C));
}
A[i] = A[i]+C[i];
}
}
double res[] = new double[grado(A) + 1];
for (int i =0; i< res.length; i++){
res [i] = A[i];
}
return res;
}
double p_eval(double A[], double x) {
double res = 0;
for (int i = 0; i < A.length; i++) {
res = res + A[i] * Math.pow(x, i);
}
return res;
}
void imprimir(double A[]){
System.out.println();
for(int i=0;i<A.length;i++){
//System.out.println(dividir(polinomio,d)[i]);
System.out.print( A[i]);
System.out.print(" | ");
}
}
double [] p_derivar(double A[]) {
double d[] = new double [grado(A)];
for(int i=0;i< d.length; i++){
d[i]= A[i+1] * (i+1);
}
return d;
}
}
A为什么改变它的值的原因仍然是我不知道的。
答
double A[]
是一个表(对象),而不是一个简单的类型变量。对函数p_div(double A[], double B[])
,您只传递对主函数中的表A和B的引用。当您更改p_div
中的A(A[i] = A[i]+C[i];
)时,您正在更改main
中的A
,因为它们(指向)是相同的。
当你说'A'改变了值时,我假设你的意思是'A'的内容,这是否正确?看到这个问题的第一个答案 - https://stackoverflow.com/questions/12757841/are-arrays-passed-by-value-or-passed-by-reference-in-java以及我建议的问题是一个副本。 – pstrjds
@pstrjds第二个答案是有帮助的。 –