编程语言
首页 > 编程语言> > java-仅传递私有成员的值

java-仅传递私有成员的值

作者:互联网

我正在创建一个类,该类使用一个数组作为其私有成员,并使用getter,setter方法.我想使用main函数中的数组为该数组设置一个值.当我在main函数中操作数组时,它不应影响该类中存在的数组.

我尝试了这段代码,但是在这里数组被操纵

class ClassB {

    private int[] a;

    ClassB() { }

    ClassB(int[] a) {
        this.a=a;
    }

    int[] geta() {
        return this.a;
    }

    void seta(int a[]) {
        this.a = a;
    }
}

public class ClassA{

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter size : ");
        int n = sc.nextInt();
        int[] d = new int[n];
        System.out.println("Enter array elements : ");
        for (int i=0 ; i<n ; i++) {
            d[i] = sc.nextInt();
        }
        final ClassB cb2 = new ClassB(d);
        d[3] = 15;
        System.out.println("After changing array d : \n Values of array d :");
        for (int i=0 ; i<n ; i++) {
            System.out.println(d[i]);
        }
        System.out.println("Values of array a of cb2 :");
        int[] b = cb2.geta();
        for (int i=0 ; i<n ; i++) {
            System.out.println(b[i]);
        }
    }
}

我预计 :

Enter size :

5

Enter array elements :
1
2
3
4
5
After changing array d :

 Values of array d :

1
2
3
15
5

Values of array a of cb2 :
1
2
3
4
5

但是实际输出是:

Enter size :

5

Enter array elements :

1
2
3
4
5

After changing array d :

 Values of array d :

1
2
3
15
5

Values of array a of cb2 :

1
2
3
15
5

解决方法:

每次设置数组或需要返回其值时,都可以在ClassB中创建防御性副本.像这样:

class ClassB {
    // ... code omitted for brevity

    ClassB(int[] a) {
        seta(a);
    }

    int[] geta() {
        int[] copy = new int[a.length];
        System.arraycopy(a, 0, copy, 0, a.length);
        return copy;
    }

    void seta(int a[]) {
        this.a = new int[a.length];
        System.arraycopy(a, 0, this.a, 0, a.length);
    }
}

旁注:

>如果您真的想使ClassB不可变,则不应为其值设置setter.
>实用程序System.arraycopy用于创建阵列的副本.可以在这里随意使用更适合您需要的内容(您可能想考虑使用Lino在下面的评论中建议的a.clone()…这是一个很好的话题:Why clone() is the best way for copying arrays?).

其他读物:

> Copy constructors and defensive copying
> How do I make defensive copy of an object?
> Is Java “pass-by-reference” or “pass-by-value”?(由Pankaj Singhal回答,我只是为了完整性而将其放在此处).
> Clone method for Java arrays

标签:pass-by-reference,pass-by-value,pass-by-rvalue-reference,arrays,java
来源: https://codeday.me/bug/20191024/1922329.html