黑马程序员技术交流社区

标题: 谁能给我详细解释一下,类在内存里的形态 [打印本页]

作者: homeless    时间: 2014-2-28 17:15
标题: 谁能给我详细解释一下,类在内存里的形态
  1. class Person
  2. {
  3.         private int age;
  4.        
  5.         public void setAge(int age)
复制代码

比如上面那个类,我知道静态代码随类加载,在new对象后,对象会在堆内存里,那这个对象里就只有一个int age=0吗?那普通代码在哪?在调用到方法的时候,这个方法是不是就一下子被复制到栈内存里了,还是不复制直接就能执行??有点晕乎啦


作者: grkbeyond    时间: 2014-2-28 21:59
你上面的不是静态代码块吧。总的来说,内里面的变量如果没有static修饰就是实例变量。随着对象的实例化而初始化。。实例变量有三种初始化方式  1,在初始化里初始化2,定义变量时初始化 3,构造器里初始化。。当创建java对象时会根据语句为该对像分配内存。至于上述方法的话,是加载进栈里的。。
作者: 咖啡@糖豆    时间: 2014-3-1 08:38
java内存分两种:一种是栈内存,一种是堆内存
1、在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
2、堆内存用来存放由new创建的对象和数组以及对象的实例变量。在函数中定义一个变量时,java就会在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
而用static的修饰的变量和方法,我们称静态代码块,是存在内存中的”固定位置”,称静态区
int  age 由于是基本数据类型声明会默认值为“0”是存在栈内存中
普通代码块也是存在栈内存中被加载使用
作者: homeless    时间: 2014-3-1 10:50
grkbeyond 发表于 2014-2-28 21:59
你上面的不是静态代码块吧。总的来说,内里面的变量如果没有static修饰就是实例变量。随着对象的实例化而初 ...

我那个不是静态代码块。我想问的是,方法不管是静态还是非静态,只要被调用到时,就会被复制到栈里执行,并且只能在栈里执行。就是用到的时候就去COPY一份。
作者: grkbeyond    时间: 2014-3-1 12:04
homeless 发表于 2014-3-1 10:50
我那个不是静态代码块。我想问的是,方法不管是静态还是非静态,只要被调用到时,就会被复制到栈里执行, ...

不能说COPY吧!一个方法如果运行结束完,它就会消失。如果程序重新调用这个方法,就会在栈里重新开辟一个空间存储这个方法。
作者: homeless    时间: 2014-3-1 12:34
grkbeyond 发表于 2014-3-1 12:04
不能说COPY吧!一个方法如果运行结束完,它就会消失。如果程序重新调用这个方法,就会在栈里重新开辟一个 ...

那是不是这样,当调用一个方法时,在栈点a开辟空间,方法代码被压入栈,程序被执行,随着栈指针移动到a点,栈内存被逐渐释放。
作者: grkbeyond    时间: 2014-3-1 15:32
这内存中具体用什么调用也不是很懂,建议你不要太深究这问题。只要知道一般方法在内存中的位置差不多就可以了。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2