2009-09-13 38 views
-8
public class Order 
{ 
    static Customer cust = new Customer(); 
    string sEmpty = ""; 

    public static void main(String args[]) 
    { 
     int iTotal = 10; 
     string sProductName = "Salt"; 
     Ship shp = new Ship(); 
    } 
} 

在上面的代码中,在哪部分内存中创建了哪个对象和引用? (我的意思是堆和栈)哪个对象被创建在哪部分内存中?

alt text http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/Images/heapvsstack1.gif

+0

家庭作业吗? –

+3

你不应该做自己的功课吗? – timdev

+0

不,因为我不是学生:) – uzay95

回答

4

既然你标记你的问题的Java,我会认为你在Java中的意思。直接从马的嘴:

Java虚拟机有一个堆在所有Java虚拟机线程中共享。该堆是 运行时数据区,其中分配了所有类实例的内存和 阵列。

JVM Spec

这里是一个link到以前的SO问题是进入这个严重的细节(并且是语言无关的讨论话题)。

这是一个link来自C#角落的文章,详细介绍了C#中的问题。

+0

在.net中它是相同的吗? – uzay95

+1

@ uzay95总之,没有。来自C#角落链接的引用应该可以帮助您:“堆栈或多或少地负责跟踪代码中执行的内容(或者”被调用“)。堆或多或少地负责跟踪我们的对象(我们的数据,呃......其中大部分 - 我们会在稍后讨论)。“ –

+0

从1.6开始,从*实施*的角度来看,这在所有情况下都不再是真实的。它对于像字符串文字这样的特定对象从来都不是完全正确的 – ShuggyCoUk

1

订单和客户堆在一起。尽管Customer可能是一个结构体,但它是一个引用类型的组成成员(例如,一个类)。

所有字符串都是引用类型,并在堆上创建。

我不确定Ship类,因为我没有它的声明(即,我不知道它是一个结构还是一个类)。

int iTotal变量在堆栈上创建。

这对于C#来说是正确的。 Java可能有不同的规则。

+0

David,你的意思是“客户可能是一个结构,它是一个引用类型的组成成员”? – Preets

+0

客户可能已被声明为struct Customer {}。结构使客户成为一种价值类型,并且在正常情况下将被放置在堆栈上。但是,因为Customer是类Order的成员,Order是放置在堆上的引用类型,所以Customer也放置在堆上。 –

+0

啊!感谢您的解释 ! – Preets

相关问题