- Khi bạn gọi fix(a1) thì a1 bị thay đổi.
- Khi bạn return chính a1 trong hàm thì kết quả trả về không phải bản sao mà là chính nó
- Khi bạn gọi long[] a2 = fix(a1), mà fix(a1) lại chính là a1 thì a2 == a1, hai mảng thực ra là 2 tham chiếu cùng trỏ đến duy nhất 1 đối tượng, nên thay đổi a1 cũng thay đổi a2
Hàm start của bạn bản chất nó như thế này:
long[] a1 = {3 ,4 ,5};
System.out.print(a1[0]+a1[1]+a1[2]+" ");
a1[1] = 7;
long[] a2 = a1;//"a2" chỉ là 1 cái tên khác của đối tượng mà cái tên "a1" đang trỏ vào
System.out.print(a1[0]+a1[1]+a1[2]+" ");
System.out.println(a1[0]+a1[1]+a1[2]); //a1 hay a2 cũng thế, vì 2 thằng đó là 1
Trong khi cái bạn muốn nó là thế này:
long[] a1 = {3 ,4 ,5};
System.out.print(a1[0]+a1[1]+a1[2]+" ");
long[] a2 = new long[a1.length];
for (int i = 0; i < a1.length; i += 1)
a2[i] = a1[i];
a2[1] = 7;
System.out.print(a1[0]+a1[1]+a1[2]+" ");
System.out.println(a2[0]+a2[1]+a2[2]);
Như vậy, hàm fix cần viết như sau:
long[] fix(long[] a3)
{
long[] output = new long[a3.length];
for (int i = 0; i < a3.length; i += 1)
output[i] = a3[i];
output[1] = 7;
return output;
}
Chú ý, chỉ có các kiểu dữ liệu primitive - “nguyên thuỷ” (boolean, byte, short, int, long, float, double, char) là truyền bản sao vào hàm, các kiểu dữ liệu khác truyền chính nó (cho nên hàm fix(a1) sẽ làm thay đổi a1). Phép gán “=” đối với các kiểu dữ liệu object - “đối tượng” (tức là không phải primitive) là phép “trỏ tham chiếu đến” chứ không phải phép “sao chép” như các kiểu primitive. Ví dụ: kiểu long[] là kiểu object, khác với long là primitive.