... Có phải vì các biến địa phương được cấp phát trên stack, và vì vậy mới của tôi đang bị thổi bay khi Tôi thoát khỏi phương pháp?
Không. Đó là vì đối số chuyển ngữ nghĩa của Java.
Đối số Java được chuyển "theo giá trị", nhưng trong trường hợp đối tượng hoặc loại mảng, giá trị bạn đang truyền là tham chiếu đối tượng/mảng. Khi bạn tạo và gán một đối tượng set mới cho mySet
, bạn chỉ cần đặt biến cục bộ/tham số. Vì Java sử dụng truyền theo giá trị, điều này không ảnh hưởng đến biến số foo
trong phương thức main
.
Khi bạn nhập phương thức test
, bạn có hai bản sao tham chiếu đến ví dụ HashSet
được tạo trong phương thức main
; một trong số foo
và một ở số mySet
. Mã của bạn sau đó thay thế tham chiếu trong mySet
với tham chiếu đến một mới được tạo ra HashSet
, nhưng tham chiếu mới này không được chuyển lại cho người gọi. (Bạn có thể thay đổi mã của bạn để vượt qua nó lại ... ví dụ như là kết quả của phương pháp test
Nhưng bạn phải làm điều này một cách rõ ràng..)
OK - tuy nhiên - nếu tôi được làm thêm hoặc một số hoạt động khác trong cuộc gọi phương thức của tôi, phân bổ đó sẽ được giữ nguyên. Tại sao vậy?
Đó là bởi vì khi bạn gọi một phương pháp dụ bằng cách sử dụng tài liệu tham khảo trong foo
hoặc mySet
, phương pháp đó được thực hiện trên đối tượng (HashSet
) mà tài liệu tham khảo đề cập đến. Giả sử rằng hai tham chiếu trỏ đến cùng một đối tượng, "phân bổ của bạn sẽ được giữ nguyên". Hoặc chính xác hơn, bạn có thể quan sát các tác động của các phép toán trên một tham chiếu đến một đối tượng thông qua các phép toán trên các tham chiếu khác tới cùng một đối tượng.
Chỉ cần nhớ rằng phương thức Java gọi các tham chiếu sao chép vào đối tượng, chứ không phải chính các đối tượng đó.
Bằng cách này, bạn sẽ không thể thêm các phần tử vào tập hợp được trả về bởi Collections.emptySet()
. Đối tượng thiết lập đó là bất biến.Gọi điện (ví dụ) add
trên đó sẽ ném một ngoại lệ.
Nguồn
2010-07-20 01:32:34
Mỹ, tuy nhiên - nếu tôi được làm thêm hoặc một số hoạt động khác trong phạm vi cuộc gọi phương thức của tôi, phân bổ đó sẽ được giữ nguyên. Tại sao vậy? –
Câu trả lời rõ ràng Stephen, cảm ơn bạn. –