-
类全局变量的Reference保存在堆中还是栈中5
比如我有两个类,分别是TestA 和 TestB
public class TestA {
public List<String> list = new ArrayList<String>();
}
public class TestB {
public static void main(String[] args) {
TestA a = new TestA();
a.list.add("Test");
}
}
我看书的时候说所有的reference都保存在栈中,而new出来的对象属性 包括全局属性都保存在堆中, 那么a应该是保存在栈里面,而new出来的TestA中的list这个Reference保存在堆还是栈啊,很困惑。
希望各位大侠解惑,谢谢2011年8月26日 10:25
5个答案 按时间排序 按投票排序
-
采纳的答案
static变量的引用在方法区,方法区可以位于堆上也可以位于栈上
非static变量的引用都在java堆上,跟对象是一起的
只有方法调用的时候,才会有java栈的操作,才会将引用入栈、出栈,但这也只是临时的,方法调用结束后,栈帧就废弃了
所以,在main方法中,本身是一个方法调用,java栈有main方法的帧,new出来的TestA中的list对象本身在堆上,引用也在堆上,但.add操作的时候会将堆中list的引用入栈以完成add操作2011年8月26日 11:28
-
如果楼主对这个问题很感兴趣,那么只有深入理解的jvm的工作原理才能理解的更透彻
我觉得lz看下《深入java虚拟机》第二版后对这个问题就大彻大悟了2011年8月26日 12:05
-
public List<String> list = new ArrayList<String>();
这个list在栈中,new ArrayList<String>()在堆中,引用list指向堆中new 的ArrayList
TestA a = new TestA();
a也在栈中,new TestA()在堆中,引用a指向堆中new的 TestA(),注意这个引用a指向的是TestA的对象a.list.add("Test");
调用对象a的成员变量list的add方法,传入字符串参数"Test"
综上,a list都是在栈中,只是指向不同而已2011年8月26日 10:41
相关推荐
2. **堆区(Heap)**:如果Block需要被长期保存(例如赋值给全局变量或强引用的属性),那么它会被复制到堆上。这时,Block内部捕获的自动变量也会被复制并保存,遵循ARC(Automatic Reference Counting)规则进行...
JS中的内存分为三大部分:栈内存、堆内存和全局变量。 1. **栈内存**:存储函数调用时的局部变量和基本类型值(如number、string、boolean、null、undefined)。当函数执行完毕,栈内存中的数据会被自动清理。 2. ...
内存管理方面,全局变量和局部变量在内存中的分配不同: 1. 栈区:存放函数参数和局部变量,由编译器自动分配和释放。 2. 堆区:程序员负责分配和释放,如果不释放,程序结束时可能由操作系统回收。 3. 全局区/静态...
- **$s0-$s7**(16-23):用于保存函数调用间的临时变量。 - **$t8-$t9**(24-25):额外的临时寄存器。 - **$k0-$k1**(26-27):保留给操作系统内核使用。 - **$gp**(28):全局指针。 - **$sp**(29):栈指针。...
- **堆**:引用数据类型存储在堆中,由于这类数据占用的空间较大且大小不固定,所以不适合放在栈中,而是通过栈中保存的指针来获取堆中数据的地址。 #### 二、数据类型检测方式 在JavaScript中,准确地识别一个...
在ARC(Automatic Reference Counting)环境下,Block默认会遵循`NSCopying`协议,当Block作为属性赋值时,会自动调用`copy`方法,将栈Block复制到堆上,确保Block的生命周期与持有它的对象一致。 9. **Block与...
通常,局部变量(在函数内部定义的变量)存储在栈内存(stack memory)中,而全局变量或动态分配的内存(例如,通过`new`操作符创建的对象)则存储在堆内存(heap memory)中。栈内存按照先进后出(LIFO)的原则管理...
堆Block存储在内存的堆区,需要手动管理,通常通过赋值或赋给强引用变量时会将栈Block复制到堆上。 ### 4. Block捕获变量 Block可以捕获和存储其定义时的局部变量,包括基本类型和对象类型。对于基本类型,Block会...
而引用类型,如类(class)、数组(array)、字符串(string)和接口(interface),在堆上存储值,在栈上存储指向堆中值的引用,这意味着对一个引用类型的修改可能会影响所有持有该引用的变量。 #### 结构体...
2. **谨慎使用全局变量和静态变量**:全局变量和静态变量的生命周期很长,可能导致长时间持有对象引用。 3. **合理使用集合类**:在使用集合时,注意在适当时候清理集合,移除不再需要的对象。 4. **使用弱引用和软...
在.NET框架中,数据类型可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。这两种类型的主要区别在于它们如何在内存中存储数据。 - **值类型**:这些类型的数据直接存储在栈内存中。当声明一个...
Block的主要特点在于其能够自动绑定变量至栈上或者通过内存管理机制将其保存在堆上,从而让开发者能够编写更加灵活和可重用的代码。 Block在C、C++和Objective-C等语言中的应用非常广泛,尤其是在iOS开发中,它们...
答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的. [Page] 26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写: namespace test { public ...
在提到的Person构造函数示例中,`new Person(100,"jxl",22)` 创建了一个新的对象实例,其属性id、name和age的值都在堆中分配,而`person`变量则在栈中保存指向这个对象的引用。数组`arr`和对象`obj`同样遵循这一...
当一个变量被声明时,它会在栈中分配空间,如果变量引用的是一个对象,则对象实际存储在堆中,栈中保存的只是指向对象的引用。 这个游戏可能会模拟JavaScript引擎的垃圾回收机制。在JavaScript中,垃圾回收是自动...
而引用类型如类(class)、接口等,则存储在堆中,变量存储的是指向实际数据的引用。理解这一点有助于开发者更好地管理内存和提高程序性能。 #### 二、日期时间解析方法 对于日期时间的解析,`.NET` 提供了两种...
5. **方法区(Method Area)**:和Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 #### 二、垃圾收集算法 Java内存管理中的关键组成部分...
- **Application**:全局变量,存储所有用户都可以访问的数据。 ### 7. 清空 TextBox 的文本 遍历当前表单中的所有控件,并清空 TextBox 控件的文本值: ```csharp foreach (System.Windows.Forms.Control control...
- **引用类型**: 主要包括类(class)、接口(interface)、数组(array)等,它们在堆内存中分配空间,赋值时拷贝的是指向值的引用。 ### 5. Override和重载的区别 - **Override**: 用于覆盖父类中的虚方法或抽象...