01/10/2018, 17:18
Chương trình hiển thị các phần tử của mảng bị sai kết quả
package test.java;
public class ClassA {
public static void main(String[] args) {
ClassA p = new ClassA();
p.start();
}
void start() {
// TODO Auto-generated method stub
long []a1 = {3,4,5};
System.out.print(a1[0]+a1[1]+a1[2]+" ");
long []a2 = fix(a1);
System.out.print(a1[0]+a1[1]+a1[2]+" ");
System.out.println(a2[0]+a2[1]+a2[2]);
}
long[] fix(long[] a3) {
// TODO Auto-generated method stub
a3[1] = 7;
return a3;
}
}
Sau khi thực thi chương trình thì kết quả hiển thị ra console:
15 15? sao không phải là 12 15?
Bài liên quan
Mảng truyền tham chiếu nên khi bạn thay đổi giá trị tham số thì giá trị gốc thay đổi theo.
bạn có thể giải thích kỹ hơn cho mình hiểu được không?
Hàm start của bạn bản chất nó như thế này:
Trong khi cái bạn muốn nó là thế này:
Như vậy, hàm fix cần viết như sau:
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.
Thanks bạn, lúc đầu mình nghĩ long chỉ là 1 kiểu primitive nên chỉ truyền được giá trị, không phải là kiểu đối tượng. Nhưng mình code lại như này :
kết quả hiển thị ra a1[0] bằng 0. có vẻ như long[] không phải là kiểu primitive, mà là 1 đối tượng. a1 a2 là 2 biến đối tượng tham chiếu tới cùng 1 giá trị và đều có quyền can thiệp vào chúng. Thanks bạn
Tôi thắc mắc – 18 Apr 15
Mình cũng vừa mới tham khảo được ở đây:
Bài 3. Sự khác nhau giữa kiểu dữ liệu cơ sở và kiểu dữ liệu tham chiếu trong...
Xin chào tất cả các bạn! Biến (variable) là một khái niệm cực kỳ quen thuộc với một developer, và đi kèm với nó chính là các kiểu dữ liệu. Ở bài trước, tớ đã cho các bạn thấy cách phân loại các kiể…
long và long[] là 2 thằng hoàn toàn khác nhau nhé. long là kiểu số nguyên 64bit còn long[] là mảng. Kiểu dữ liệu tham chiếu không chỉ có đối tượng mà còn các kiểu dữ liệu khác trừ primitive. Bạn xem lại 1 chút về kiến thức java cơ bản để nắm chắc hơn, đừng code lung tung rồi đoán già đoán non dễ dẫn đến kiến thức sai rất nguy hiểm
Hi Quân, mình đã suy nghĩ về vấn đề này. Như bạn nói thì long[] chỉ là 1 mảng mà các phần tử của nó có kiểu primitive long. Vậy làm thế nào mà nó trở thành kiểu tham chiếu được??
Thanks mọi người. Kiểu tham chiếu gồm kiểu mảng, kiểu đối tượng class và kiểu interfacec close topic ạ
Interface ko phải kiểu dữ liệu mà chỉ là “tập hợp các thuộc tính”, mỗi đối tượng đều phải thuộc một class nào đó và class có thể có thêm interface.
Kiểu mảng là một class, một mảng là một đối tượng.
Thế nên một tham chiếu chỉ tham chiếu đến một đối tượng, có thể tham chiếu thông qua class hoặc interface, kiểu tham chiếu chỉ có các class.
Phân biệt tham chiếu và tham trị trong java - IT Phú Trần - Chia sẻ kiến thức...
Tham chiếu và tham trị trong java rất dễ gây nhầm lẫn cho các bạn mới học,kể cả các lập trình viên code lâu năm cũng đôi lúc có sự nhầm lẫn về sự phân biệt khái niệm tham chiếu và tham trị trong java.Trong bài này,tôi sẽ chia sẻ theo kinh nghiệm...
Bài viết này có nói kiểu tham chiếu bao gồm cả một mảng. Mình thấy đúng vì như thế mới giải thích được code của mình rằng a2 = fix(a1); a1 là 1 mảng, khi thực hiện xong thì a1 đã bị thay đổi giá trị của phần tử a1[1].
Bài viết đó nói đúng nhưng không chính xác. Mảng cũng là lớp đối tượng Class. Còn Interface không đứng riêng lẻ, thế nên nếu một đối tượng có thể được tham chiếu qua được Interface thì sẽ tham chiếu được qua Class.
Chung quy lại, dữ liệu chỉ có 2 dạng: đối tượng và nguyên thuỷ, và để tham chiếu đến đối tượng thì qua kiểu dữ liệu (là Class trực tiếp của đối tượng) hoặc qua định danh (là Class hoặc Interface hoặc super Class của đối tượng)