シャヒーンAhamed S:
私はそのプライベートメンバとゲッターとして1つの配列、そのためのsetterメソッドを持つクラスを作成しています。私は、主な機能の配列を使用してその配列に値を設定します。私は、主な機能の配列を操作すると、そのクラスの配列の存在に影響を与えるべきではありません。
私はこのコードを試してみましたが、ここで配列を操作します
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
lealceldeiro:
あなたは作ることができます守備のコピーで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
不変、あなたはその値のためのセッターを持つべきではありません。 - ユーティリティは、
System.arraycopy
配列のコピーを作成するために使用されました。ここでは、より良いあなたのニーズに合ったものを使用してお気軽に(あなたが使用して検討する必要がありますa.clone()
...これはそれについての良いトピックです:クローンは、()の配列をコピーするための最良の方法であるのはなぜ?)。
追加の測定値: