Điều này có phân bổ vị trí bộ nhớ mới không? Hoặc chỉ cần thay thế giá trị ban đầu?
Java không thực sự đảm bảo rằng các biến sẽ tương ứng với vị trí bộ nhớ; ví dụ, phương pháp của bạn có thể được tối ưu hóa theo cách mà i
được lưu trữ trong sổ đăng ký — hoặc thậm chí không được lưu trữ, nếu trình biên dịch có thể thấy rằng bạn không bao giờ thực sự sử dụng giá trị của nó hoặc nếu nó có thể theo dõi qua mã và sử dụng trực tiếp các giá trị thích hợp.
Nhưng hãy gạt sang một bên. . . nếu chúng ta lấy trừu tượng ở đây là biến cục bộ biểu thị vị trí bộ nhớ trên ngăn xếp cuộc gọi, thì i = 11
sẽ chỉ sửa đổi giá trị tại vị trí bộ nhớ đó. Nó sẽ không cần phải sử dụng một vị trí bộ nhớ mới, bởi vì biến số i
là điều duy nhất đề cập đến vị trí cũ.
Điều này có nghĩa là nguyên thủy là không thay đổi?
Có và không: có, nguyên thủy là không thay đổi, nhưng không, không phải vì những điều trên.
Khi chúng tôi nói rằng điều gì đó có thể thay đổi, chúng tôi có nghĩa là nó có thể bị đột biến: thay đổi trong khi vẫn có cùng một danh tính. Ví dụ, khi bạn phát triển tóc của bạn, bạn đang biến đổi chính mình: bạn vẫn là bạn, nhưng một trong những thuộc tính của bạn là khác nhau.
Trong trường hợp nguyên thủy, tất cả các thuộc tính của chúng được xác định đầy đủ bằng danh tính của chúng; 1
luôn có nghĩa là 1
, bất kể điều gì và 1 + 1
luôn là 2
. Bạn không thể thay đổi điều đó.
Nếu biến số int
nhất định có giá trị 1
, bạn có thể thay đổi giá trị 2
thay thế, nhưng đó là tổng thay đổi nhận dạng: không còn giá trị như trước. Điều đó giống như thay đổi me
để trỏ đến người khác thay vì cho tôi: nó không thực sự thay đổi tôi, nó chỉ thay đổi me
.
Với đối tượng, tất nhiên, bạn có thể thường làm cả hai:
StringBuilder sb = new StringBuilder("foo");
sb.append("bar"); // mutate the object identified by sb
sb = new StringBuilder(); // change sb to identify a different object
sb = null; // change sb not to identify any object at all
Trong cách nói thông thường, cả hai sẽ được mô tả là "thay đổi sb
", bởi vì mọi người sẽ sử dụng "sb
" cả hai để tham khảo các biến (có chứa tham chiếu) và đối tượng mà nó đề cập đến (khi nó đề cập đến một tham chiếu). Đây là loại looseness là tốt, miễn là bạn nhớ sự khác biệt khi nó quan trọng.
Nó sẽ không tạo vị trí mới trong bộ nhớ. – Maroun
Nó sẽ thay thế bản gốc. Java nguyên thủy ** không phải là ** đối tượng. 'Integer' (và các lớp wrapper nguyên thủy khác) ** là ** không thay đổi. –
@BrianRoach không, anh ta đã không làm vậy. Theo logic của bạn, các chuỗi có thể thay đổi: 'String str =" test "; str = "newStr"; '. Để trả lời câu hỏi của OP, họ thực tế không thay đổi được. Nếu bạn xem xét 'i ++', đó thực sự là: 'i = i + 1'. Bạn có thể thấy giá trị của 'i', thêm một và gán lại' i' cho giá trị mới này. –