实例变量存储在哪里(实例变量是存在堆里还是栈)
本文目录
- 实例变量是存在堆里还是栈
- java的方法中new的对象存储在内存中那个区域
- java中的实例方法存在哪
- final 修饰的变量 对存储方式有何影响望高手回答!
- Java静态方法和实例方法在内存的分布情况
- c++中的类和实例分别存储在什么地方
- java类中成员变量初始化后存放在堆内存中还是栈内存中
实例变量是存在堆里还是栈
你这里提到的对象,如果是new出来的,那么它会被放在堆里,其实例变量也被放置在堆里。如果不是new出来的,则要根据其性质进行判断。可能在data中,也可以在bss段中
java的方法中new的对象存储在内存中那个区域
这个对象存在堆中,还是栈中?答:堆,new一个对象,一定是在堆中方法内部new出来的对象,在哪里存着?答:堆,new出来对象的实例变量都存在堆上面。栈,这个东西,需要理解为:线程运行时,才会创建,执行完,就没了。Person p = new Person();上面这段代码,在执行时,p压入栈,通过局部变量表,找到对应的【实例数据】,执行完毕后释放。
java中的实例方法存在哪
HI我,我对你的问题蛮感兴趣的 类的实例方法在内存中是只有一份,不过肯定不会是第一个对象中,如果是第一个对象的话,那么当第一个对象被销毁的时候,那么后面的对象就永远无法调用了...类的实例方法存在一个专门的区叫方法区,事实上类刚装载的时候就被装载好了,不过它们在"睡眠",只是这些方法必须当有对象产生的时候才会"苏醒".(比如,一个输出类的成员变量的方法,如果连对象都没有,何来的输出成员变量).所以,方法在装载的时候就有了,但是不可用,因为它没有指象任何一个对象。而静态的又不一样了,静态的东西存在静态区,他们和类是一个等级的,就是说只要类被装载,它们就可以直接用.(用类名来调用).他们不依赖与任何对象,所以也不能输出任何对象的成员属性.(除非成员属性也是静态的).而你最后的一句话也是错的,"类的所有数据在内存中只有静态的才又空间".当然不是,每个对象在new的时候都会在堆区中开辟内存,用来保存对象的属性和方法.(实际上方法保存的只是方法区的引用,如果保存的是方法本身,那么试想一下,有多少个对象就得有多少个方法,那么又和第一点中"实例方法在内存中只有一份拷贝"相矛盾了)好了,事实上内存图很复杂和麻烦,算比较深的东西了,很多用JAVA多年的人也不太了解其原理,因为开发也不要用..
final 修饰的变量 对存储方式有何影响望高手回答!
首先有一点你要明白,final关键字对于变量的存储区域是没有任何影响的。jvm规范中,类的静态变量存储在方法区,实例变量存储在堆区。也就是说static关键字才对变量的存储区域造成影响。final关键字来修饰变量表明了该变量一旦赋值就无法更改。同时编译器必须保证该变量在使用前被初始化赋值。例如你的staticfinalintc1这个变量,是一个静态变量,静态变量的初始化可以在静态块中进行。而非static变量,可以初始化块中和构造方法中进行。如果你在这几个地方没有对final变量进行赋值,编译器便会报错。
Java静态方法和实例方法在内存的分布情况
像类、静态(static)变量还有代码块都存储在方法区里,栈中存储的是静态方法、实例方法和变量,堆中存储的是实例对象和实例变量。
c++中的类和实例分别存储在什么地方
类不会储存在什么地方,只是告诉程序,如何去创建这个类型的变量、需要多少个字节、以及如何销毁等等等。至于实例,也可以说对象,在什么地方,就是我们通常说的堆栈。抛开全局常量区以及静态存储区这些不谈。如果你new了一个对象(还有其他的c的分配方式,比如malloc不推荐使用),这种就属于动态分配内存,分配在堆上。堆相对于栈很大,所以很多时候我们分配在堆上,但也意味着,你需要知道什么时候去销毁他,所以与delete或delete 成对出现。Student stu; 类似于这样的我们没有使用new的对象就分配在了栈上。他的对象是自己管理的。在 {}函数体中的最后会自动按照栈的后进先出,销毁对象。所以不需要你去管理对象的内存,但也意味着对象所在的生命周期通常就是一个{}中。补充,堆除了比栈空间大,它是在程序运行时来分配内存的,比如分配int * i = new i ; //m 是在程序运行后,从输入中得到的数值。但栈不可以,int i;//这里必须是常量 const int m = 1000; 在程序编译的时候,他就必须知道数组有多大。
java类中成员变量初始化后存放在堆内存中还是栈内存中
栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。堆内存:通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。
更多文章:
thinkpad t400s(thinkpadT400升级改造)
2024年7月9日 18:35