JavaRush /Blog Java /Random-VI /Truyền tham số trong Java
vincent_vega
Mức độ
Gainesville

Truyền tham số trong Java

Xuất bản trong nhóm
Một biến trong Java là một thùng chứa một giá trị trong đó. Vậy việc "chuyển" một biến có nghĩa là gì? Và sự khác biệt giữa kiểu dữ liệu nguyên thủy và tham chiếu là gì.
Truyền tham số trong Java - 1
Chúng ta sẽ nói đến điều đó sau. Trước tiên hãy bắt đầu với một bài tập đơn giản. Mã này làm gì:
int х = 3;
int у = х;
Trên dòng 1, một biến x thuộc loại int được tạo và gán giá trị 3. Trên dòng 2, một biến y thuộc loại int được tạo và gán giá trị của biến x . Trong tương lai, biến x không ảnh hưởng gì đến y cả . Java sao chép giá trị của x (3) và đặt giá trị sao chép vào y . Đây là truyền tham số theo giá trị. Bạn không viết biến này sang biến khác. Giá trị được sao chép và gán cho một biến mới. Biểu thức y = x; KHÔNG có nghĩa là "viết x cho y ". Nó có nghĩa là "sao chép giá trị bên trong x và viết bản sao đó vào y ." Nếu sau này tôi thay đổi y :
у = 34;
Điều này có ảnh hưởng đến x không ? Dĩ nhiên là không. x vẫn có giá trị 3. Nếu sau này tôi thay đổi x :
х = 90;
Điều này sẽ ảnh hưởng đến bạn như thế nào ? Không đời nào. Chúng không liên quan dưới bất kỳ hình thức nào sau khi việc chuyển nhượng được thực hiện (SAO CHÉP giá trị). Còn các loại tài liệu tham khảo thì sao? Họ làm việc như thế nào? Không khó lắm, thực tế quy tắc là như nhau. Các liên kết cũng làm điều tương tự - bạn nhận được một bản sao của liên kết. Vì vậy nếu tôi nói:
Cat A = new Cat ();
Cat B = A;
Liên kết A được sao chép vào liên kết B. Điều này không áp dụng cho đối tượng - bạn vẫn chỉ có một đối tượng. Nhưng bây giờ bạn có hai tham chiếu khác nhau điều khiển cùng một đối tượng Cat . Bây giờ hãy xem xét việc truyền tham số cho các phương thức. Java truyền tham số theo giá trị. Luôn luôn. Điều này có nghĩa là "sao chép giá trị và chuyển bản sao." Đối với các kiểu nguyên thủy thật dễ dàng:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
Phương thức doStuff trông như thế này:
void doStuff (int у) {

   / / Действия с 'y'
}
Một bản sao giá trị của x , tức là 5, được truyền cho phương thức doStuff() . Phương thức doStuff() có biến riêng được gọi là y . Biến y là một biến mới, khác biệt. Với một bản sao của nội dung có trong x tại thời điểm chuyển nó sang phương thức. Từ nay yx không còn ảnh hưởng gì đến nhau nữa. Khi bạn thay đổi y , bạn không ảnh hưởng đến x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Và ngược lại - nếu bạn thay đổi x thì bạn sẽ không thay đổi y . Điều duy nhất x làm trong trường hợp này là sao chép giá trị của nó và chuyển nó vào phương thức doStuff() . "Truyền theo giá trị" hoạt động như thế nào với tham chiếu? Quá nhiều người nói, "Java chuyển các kiểu nguyên thủy theo giá trị và các đối tượng theo tham chiếu". Đó không phải là những gì họ nói. Java chuyển mọi thứ theo giá trị. Với kiểu nguyên thủy, bạn sẽ có được một bản sao của nội dung. Với các liên kết, bạn cũng có được một bản sao của nội dung. Nhưng nội dung của liên kết là gì? Điều khiển từ xa. Cơ sở vật chất để quản lý/tiếp cận cơ sở. Khi bạn truyền một tham chiếu đến một đối tượng cho một phương thức, bạn đang truyền một bản sao của tham chiếu đó. Bản sao điều khiển từ xa. Đối tượng vẫn nằm trong đống nơi nó được tạo ra, chờ ai đó sử dụng điều khiển từ xa. Cơ sở không quan tâm có bao nhiêu điều khiển từ xa được "lập trình" để điều khiển nó. Những người duy nhất quan tâm đến vấn đề này là người thu gom rác và bạn, lập trình viên. Vì vậy, khi bạn nói:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Chỉ có một đối tượng Cat . Nhưng bây giờ hai điều khiển từ xa (liên kết) có thể truy cập vào cùng một đối tượng Cat . Vì vậy, bây giờ bất cứ điều gì B làm với đối tượng Cat sẽ ảnh hưởng đến Cat được chỉ ra bởi A , nhưng nó sẽ không ảnh hưởng đến nội dung của A ! Bạn có thể thay đổi Cat bằng liên kết mới B (được sao chép trực tiếp từ A ), nhưng bạn không thể thay đổi A. Điều này có nghĩa là gì vậy? Bạn có thể thay đổi đối tượng mà A tham chiếu đến , nhưng bạn không thể thay đổi tham chiếu của A - chuyển hướng nó sang đối tượng khác hoặc null . Vì vậy, nếu bạn thay đổi tham chiếu của B (không phải đối tượng Cat thực tế mà B tham chiếu mà là giá trị của chính tham chiếu đó), bạn sẽ không thay đổi giá trị của A . Và ngược lại. Vì thế:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Nó đơn giản có nghĩa là B trỏ đến một đối tượng khác. A vẫn vui vẻ. Vì vậy hãy lặp lại theo tôi: Java chuyển mọi thứ theo giá trị. (Được rồi, một lần nữa... với cảm giác.) Java chuyển mọi thứ theo giá trị. Đối với các kiểu nguyên thủy, bạn chuyển một bản sao của giá trị hiện tại, đối với các tham chiếu đối tượng, bạn chuyển một bản sao của tham chiếu (điều khiển từ xa). Bạn không bao giờ vượt qua đối tượng. Tất cả các đối tượng được lưu trữ trên heap. Luôn luôn. Bây giờ hãy pha một tách cà phê khổng lồ và viết một số mã! Bài báo gốc .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION