2010-09-07 31 views
8

Kể từ khi enum trong C# là trên ngăn xếp, tôi đã tự hỏi nơi enum, trong Java, nơi tạo ra. Trên ngăn xếp? Trên đống? Ở một nơi bí ẩn nào khác?Enum của Java ... Chúng được tạo ra ở đâu?

Enumeration trong C# có nhiều nguyên thủy hơn so với Java, điều này có thể giải thích tại sao họ được tạo ra trên stack ...

họ đang ở đâu? Tôi không thể tìm thấy chúng!

Cảm ơn

+4

Enums trong C# * có thể * nằm trên ngăn xếp, nhưng chúng cũng có thể nằm trên heap. Tất cả phụ thuộc vào nơi chúng được sử dụng (trường/tham biến/biến địa phương). Họ là những loại giá trị mặc dù, có lẽ đó là nơi mà sự nhầm lẫn đến từ đâu? Bên cạnh đó, trong .NET nó không quan trọng, nơi nội dung của một biến được lưu trữ; đây chỉ là một chi tiết thực hiện (và có thể thay đổi trong một thực hiện khác nhau của CLR). –

+1

Trong sự tò mò hoang dã, tại sao bạn muốn biết liệu họ đang ở trên ngăn xếp hoặc đống? – whaley

+1

@whaley Sự tò mò đơn giản – ALOToverflow

Trả lời

9

Enums trong Java cũng là đối tượng: ví dụ: enums có thể có biến mẫu/phương pháp/nhà thầu và giao diện triển khai. Tất cả điều này làm cho tôi nghĩ rằng họ đang xử lý giống như các đối tượng khác bằng jvm.

+1

Có nghĩa là ... Họ đang trên đống. – romacafe

6

Vì Java enums extendjava.lang.Enum, chúng được tạo trên heap giống như tất cả các đối tượng Java khác.

+1

Về mặt kỹ thuật, chúng mở rộng 'Enum'. Nhưng đó là trạng thái của chúng như là các đối tượng (tức là: chúng cũng mở rộng 'đối tượng' gián tiếp) làm cho chúng trở thành kiểu tham chiếu. – cHao

+0

@ 0xA3: Chúng mở rộng 'java.lang.Enum' tự mở rộng' java.lang.Object'. – LukeH

+0

Không, 0xA3, ý tôi là những gì tôi nói. Hãy xem liên kết javadocs mà tôi đã đăng. Họ mở rộng java.lang.Enum, mà lần lượt mở rộng java.lang.Object. – duffymo

2

Enums là các đối tượng trong Java, vì vậy chúng nằm trong vùng heap. Tuy nhiên, đối với mỗi loại chỉ có một số cố định của chúng. Mã khách hàng đang xử lý các tham chiếu đối với các đối tượng enum này, do đó, không thực sự tạo ra bất kỳ thứ gì trên heap. Như đã từng thấy từ một điểm đặc tả: các tham chiếu biến cục bộ nằm trên ngăn xếp; tham chiếu trường đối tượng là trên heap.

+0

câu đầu tiên - "do đó, họ đang ở trên ngăn xếp" - tôi nghĩ bạn có nghĩa là để nhập "để họ đang trên đống";) – serg10

+0

@ serg10 Có. Không muốn điều đó #. –

2

Chúng là các đối tượng, giống như bất kỳ đối tượng nào khác, vì vậy bản thân enum nằm trên vùng heap. Một biến chứa tham chiếu đến một enum có thể nằm trên stack nếu nó là một biến chức năng, hoặc nó có thể nằm trên heap bên trong một số đối tượng khác nếu nó là một thành viên của một đối tượng.

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