- 对象 emp 存储在内存中的位置,即堆栈或堆中以及如何存储?
这个问题措辞不好。emp
不是对象;emp
是一个包含对对象的引用的变量。
所以让我们改写这个问题:
1 (a) 引用的对象emp
在内存中存储在哪里?
变量所指的对象emp
存储在长期存储中,也称为“堆”。
图1(b)emp
是一个变量,因此代表一个存储位置。该存储位置在内存中的什么位置?
这个问题没有提供足够的信息来说明。变量emp
可以是静态字段、实例字段或局部变量。(由于分号,它不能是形式参数。)如果是局部变量,它也可以是 lambda 的封闭外部变量,或迭代器块的局部变量,或异步方法的局部变量。所有这些都会改变变量的存储是短期存储还是长期存储。如果它在短期存储中,它可能在堆栈上,也可能是一个寄存器。
2name
和age
变量存储在内存中的什么位置以及如何存储?
由于它们是类的字段,因此与这些变量关联的存储位置始终位于长期堆上。
由于name
是 type string
,它所指的东西——一个字符串——也在堆上。(或者,变量可能为空,在这种情况下它不引用任何东西。)
3 此语句中的每个单词是做什么的,即employee 做什么..then emp..then =.. then new.. then employee.. then ()..then ;
这个问题措辞非常糟糕。首先,那些不是“词”,那些是“令牌”。(并且()
是两个标记。)其次,完全不清楚这个问题的“做”是什么意思。所以让我们问一个不同的问题:
3 详细描述此声明在运行时执行时执行的操作。
我们不能准确地说,因为问题中没有足够的信息。问题说它是一个声明,所以它不是一个字段声明。为简单起见,我们假设它不在迭代器块或异步方法中,并且 local 不是任何匿名函数的外部变量。
首先,为变量分配短期存储;它很可能被注册;如果没有,它将在堆栈上。它被分配了一个空引用。
其次,要求内存分配器为堆上的 Employee 实例产生空内存。它这样做并产生对该内存的引用。
第三,如果这是我们第一次看到 Employee 并且 Employee 有一个静态构造函数,那么静态构造函数就会运行。
第四,静态 ctor 完成后,Employee 的字段初始化程序运行。
第五,Employee 的基类构造函数运行。这可能会导致其他静态构造函数执行。
第六,Employee的构造函数体运行。
第七,构造函数完成,对现在初始化对象的引用被复制到它的存储中。
当然,所有这一切都假设在此过程中没有任何事情引发异常。
4 上面的语句和 有什么区别Employee emp;
?告诉内存分配。
该问题没有包含足够的信息来给出准确的答案。如果从未使用过局部变量,则编译器可以自由地对其进行优化。如果它没有优化它,那么存储空间emp
会从短期池中分配出来,初始化为 null,并且永远不会使用。