【发布时间】:2010-03-28 11:51:56
【问题描述】:
为什么使用new 关键字进行对象初始化称为动态内存分配,因为编译时本身我们需要知道该对象所需的内存。
另外请解释当您在 heap 和 stack 中执行 ClassA object = new ClassA(); 时会发生什么。
【问题讨论】:
标签: java memory-management instantiation
为什么使用new 关键字进行对象初始化称为动态内存分配,因为编译时本身我们需要知道该对象所需的内存。
另外请解释当您在 heap 和 stack 中执行 ClassA object = new ClassA(); 时会发生什么。
【问题讨论】:
标签: java memory-management instantiation
所有 Java 对象是动态分配的。你总是传递对它们的引用。这就是语言的设计方式。当你这样做时:
ClassA obj = new ClassA();
然后在堆上分配对象,并将对它的引用存储在堆栈中(当然,假设它在方法内部)。这意味着您可以随时传递对象而不必担心它们的存储位置。
【讨论】:
obj 变量在方法调用中,所以显然对对象的引用在堆栈上。与整个程序中的所有其他 Java 对象一样,对象本身位于堆上。甚至类都在堆上(尽管 JIT 编译器可能会在幕后做一些额外的技巧)。
它是动态的,因为您不知道何时它需要分配 - 您按需分配。
还请注意,您知道该对象需要多少内存,但不知道该对象的成员需要多少。这可能只能在运行时确定(例如,可变大小的数组)。
【讨论】:
如果你有一个 JMath 类并且你想在运行时获取它的所有对象(动态分配)那么你就写了
ArrayList<JMath> J = new ArrayList<JMath> ();
【讨论】: