2011-10-06 10 views
10

Chúng tôi có hai phân loại chồng và xếp chồng. Khi một đối tượng được tạo, bộ nhớ cho đối tượng được lưu trữ trong heap. Điều gì sẽ xảy ra nếu lớp có các phương thức tĩnh, có thể được gọi bằng cách sử dụng tên lớp. Nếu đối tượng không được tạo thì nó sẽ phân bổ bộ nhớ như thế nào và nếu nó phân bổ bộ nhớ ở đâu?Phân bổ bộ nhớ phương thức tĩnh

+1

ngôn ngữ nào? – NPE

+2

Và bộ nhớ được cấp phát này có nghĩa là gì? –

+0

Rõ ràng từ bình luận bên dưới rằng đó là Java, vì vậy tôi đã thêm một thẻ Java. –

Trả lời

1

Phương thức (ví dụ: mã) không được lưu trữ trong một đối tượng; tất cả các đối tượng của một lớp sẽ chia sẻ mã cho một phương thức. Bất kể ngôn ngữ (Java, C++, hoặc hầu như bất cứ điều gì khác) sẽ chỉ có một bản sao của mã cho bất kỳ phương thức nào, tĩnh hay không. Nói chung có một khu vực cụ thể của bộ nhớ - tức là, một phân đoạn CODE trong một ngôn ngữ bản địa như C + +, hoặc một khu vực đặc biệt heap trong Java - nơi mã được nạp.

+0

Bộ nhớ OK cho các đối tượng được tạo cùng với lớp. tức là chỉ bộ nhớ cho lớp được tạo ra trong heap (java) Chỉ khi chúng ta sử dụng toán tử mới, chúng ta có thể tạo bộ nhớ. Nhưng đối với các lớp như Toán, chúng tôi không thể khởi tạo .. trong trường hợp đó bộ nhớ được tạo ra ở đâu? – Harini

+0

Như tôi đã nói (nhưng tôi không chắc bạn đã hiểu), mã không được lưu trữ trong các đối tượng, vì vậy đây không phải là một vấn đề gì cả. Nó không được lưu trữ bất cứ nơi nào mà bạn có thể nhận được nó, trên thực tế. Nó được lưu trữ ở nơi khác trong một phần đặc biệt của heap. JVM tải bytecode từ một tệp lớp, chuyển đổi nó theo một số cách thức triển khai phụ thuộc và làm cho các phương thức có sẵn cho chương trình của bạn. –

+0

@ user980918 java.lang.Math không cần nhiều bộ nhớ khi chạy - phần duy nhất tôi có thể nghĩ đến là biến tĩnh chứa đối tượng 'Random'. Các biến tĩnh cho một lớp được lưu trữ trong heap, cùng với đối tượng 'Class'. (Các biến cục bộ trong các phương thức nằm trong ngăn xếp, độc lập với phương thức tĩnh của phương thức.) –

2

Tùy thuộc vào JVM, nhưng các trường tĩnh thường được lưu trữ trong một đối tượng đặc biệt trên vùng heap. (Bạn có thể nhìn thấy nó trong một bãi chứa đống) Khi ClassLoader được dỡ xuống, các lớp của nó và các trường "đối tượng" tĩnh của chúng cũng được làm sạch.

Điều duy nhất khác về "đối tượng" tĩnh là bạn không thể tham chiếu đến nó. (Nhưng bạn có thể sử dụng phản chiếu để truy cập các trường)