2013-03-13 18 views
7

Giả sử chúng ta có một lớp:Java phân bổ bộ nhớ cho một cá thể mới (với một thuộc tính String) như thế nào?

class Account { 
     String name; 
     int ID; 
    } 

Sau đó

a1 = new Account(); 

a2 = new Account(); 

sẽ tạo ra 2 biến trỏ đến 2 vị trí bộ nhớ lưu trữ 2 trường hợp của class Account. Câu hỏi của tôi là làm thế nào Java có thể biết làm thế nào lớn các trường hợp này là để phân bổ bộ nhớ của họ (Bởi vì với loại String, chúng tôi có thể gán bất kỳ chuỗi nào. Ví dụ, a1.name = "Solomon I", a2.name = "Alan". Điều này sẽ dẫn đến kích thước khác nhau của từng trường hợp)

Vị trí bộ nhớ là chuỗi byte 'liên tục'. Vì vậy, nếu tôi có a1 = new Account() thì a2 = new Account() => vị trí bộ nhớ a1 được cố định ('bộ nhớ đã sử dụng | a1 | a2') vậy điều gì sẽ xảy ra nếu tôi tạo a1.name là một chuỗi rất dài? Vị trí bộ nhớ của a1 sẽ mở rộng đến vị trí bộ nhớ của a2?

Cảm ơn bạn đã đọc nội dung này, vui lòng cho tôi biết nếu tôi có bất kỳ quan niệm sai lầm nào.

Trả lời

12

name là tham chiếu chuỗi (không phải chuỗi thực tế). Nó sẽ "trỏ" tới một đối tượng String khi bạn gán nó.

Vì vậy, như một phần của đối tượng của bạn, java chỉ cần "phân bổ" không gian cho tham chiếu String, cộng với int, có kích thước không đổi.

+0

Cảm ơn bạn rất nhiều. Giải thích rõ ràng;) –

1

Đối tượng chỉ giữ tham chiếu đến đối tượng khác (biến thành viên). Vì vậy, kích thước của nó sẽ luôn luôn được cố định. Vì vậy, việc thay đổi nội dung của đối tượng được giới thiệu sẽ không ảnh hưởng đến kích thước của đối tượng đề cập đến nó. Vì vậy, bạn không cần lo lắng về kích thước String và đối tượng lớp 'Tài khoản' của bạn sẽ không bị ảnh hưởng ngay cả khi bạn thay đổi Chuỗi, vì chỉ tham chiếu String được lưu trữ bởi đối tượng lớp 'Tài khoản'.

Hy vọng điều này đã giúp bạn.

+0

Cảm ơn bạn. Tôi hiểu;) –

+0

Bạn được chào đón. :) –

Các vấn đề liên quan