2011-11-14 31 views
5

Trong java, bạn không thể nêu kích thước của một mảng trong việc kê khai của mìnhở đâu "null" trong bộ nhớ

int[5] scores; //bad 

Tôi nói điều này là bởi vì JVM không phân bổ không gian trong bộ nhớ cho đến khi một đối tượng được khởi tạo. Nếu bạn có một biến mảng thể hiện (tự động khởi tạo với giá trị mặc định là null), biến đó có trỏ đến một vị trí trong vùng heap chỉ ra null không?

+0

'0' ... như trong .... NULL (không có gì, nada, zippo) –

+0

Bạn đánh Harry Flugleman vào một ngày tồi tệ. – tenfour

Trả lời

3

Không, bởi vì trong JVM không cần cho điều đó. Nếu bạn đang ở một ngôn ngữ mẹ đẻ (ví dụ C và C++), NULL là một con trỏ có giá trị bằng 0 và trỏ đến địa chỉ cơ sở bộ nhớ. Rõ ràng đó không phải là một địa chỉ hợp lệ, nhưng bạn "có thể" dereference nó anyway - đặc biệt là trong một hệ thống mà không cần bảo vệ bộ nhớ, như cũ MS-DOS hoặc nhỏ cho các bộ vi xử lý nhúng. Không phải là địa chỉ hợp lệ - thường là vị trí đó chứa các vectơ ngắt và bạn không nên chạm vào chúng. Và tất nhiên trong bất kỳ hệ điều hành hiện đại nào sẽ gây ra lỗi bảo vệ. Tuy nhiên, trong JVM một tham chiếu đến một đối tượng giống như một xử lý (tức là một chỉ mục trong một bảng) và null là một giá trị 'không thể' (một chỉ số nằm ngoài miền của bảng), vì vậy nó có thể không được dereferenced và không chiếm không gian trong bảng như vậy.

+0

ok, vì vậy giá trị null chỉ được giữ trong biến trên ngăn xếp? – Adam

+0

Có. JVM sẽ kiểm tra khi nào (và nếu) nó bị hủy đăng ký, và đưa ra một ngoại lệ nếu nó là null. –

+0

Ngoài ra hãy xem câu hỏi liên quan này, nó có một câu trả lời rất chi tiết: http://stackoverflow.com/questions/2707322/what-is-null-in-java –

1

Không ... bạn sẽ có tham chiếu null (0x00) trong biến của đối tượng.

3

Tham chiếu null có nghĩa đen là giá trị bằng 0. Hệ điều hành ngăn cản bất kỳ chương trình nào truy cập vào địa chỉ zero trong bộ nhớ, vì vậy JVM sẽ chủ động kiểm tra và đảm bảo rằng giá trị tham chiếu không phải là 0 trước khi cho phép bạn truy cập nó. Điều này cho phép JVM cung cấp cho bạn một NullPointerException tốt hơn là một "Chương trình đã thực hiện một hoạt động bất hợp pháp" sụp đổ.

Vì vậy, bạn có thể nói rằng biến "trỏ tới" vị trí heap không hợp lệ. Hoặc bạn chỉ có thể nói biến không "trỏ tới" bất cứ điều gì. Tại thời điểm đó nó chỉ là một câu hỏi của ngữ nghĩa.

+1

NullPointerException. – EJP

+0

@EJP: Lưu ý đúng. – StriplingWarrior

+0

Đó là hệ điều hành cụ thể về việc liệu 0 có phải là địa chỉ bộ nhớ hợp lệ hay không. –

2

Tôi nghĩ rằng bài này sẽ trả lời câu hỏi của bạn - Java - Does null variable require space in memory

Trong Java, null chỉ là một giá trị mà một tài liệu tham khảo (mà về cơ bản là một hạn chế con trỏ ) có thể có. Điều đó có nghĩa là tham chiếu tham chiếu đến không có gì. Trong trường hợp này bạn vẫn tiêu thụ không gian cho tham chiếu. Đây là 4 byte trên hệ thống 32 bit hoặc 8 byte trên hệ thống 64 bit. Tuy nhiên, bạn không tiêu tốn bất kỳ không gian nào cho lớp mà các điểm tham chiếu cho đến khi bạn thực sự phân bổ một thể hiện của lớp đó để trỏ tham chiếu tại.

Chỉnh sửa: Theo như chuỗi, một chuỗi trong Java mất 16 bit (2 byte) cho mỗi ký tự, cộng với một lượng nhỏ phí giữ sách, có thể không có giấy tờ và thực hiện cụ thể.

(nhớ để upvote câu trả lời trong các liên kết nếu nó giúp bạn ra ngoài)

0

Tôi cho rằng "int [5] score; // bad" không phải do cấp phát bộ nhớ. Lưu ý rằng khi bạn khai báo điều gì đó, bạn thực sự khai báo Loại ReferenceName = new Type() thường.

Quan sát hai ví dụ int [] score = new int [5]; Nhãn JLabel = JLabel mới();

Các loại (ở phía bên trái) là int [] và JLabel, không liên quan gì đến cấp phát bộ nhớ (ngoại trừ con trỏ), trong khi các phiên bản mới (ở bên phải, yêu cầu cấp phát bộ nhớ) int [5], yêu cầu không gian cho 5 int và JLabel(), không yêu cầu đối số để gọi hàm tạo, nhưng đủ bộ nhớ cho một JLabel.

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