黑马程序员技术交流社区
标题: 对象的初始化过程疑问 [打印本页]
作者: 小黑马 时间: 2012-9-3 21:46
标题: 对象的初始化过程疑问
本帖最后由 马小龙 于 2012-9-4 10:07 编辑
对象的初始化过程:
1.JAVA虚拟机加载类文件
2. static代码块执行
3.开辟堆栈空间(对象在堆内存中创建并且有地址,引用变量在栈中创建)
4.属性默认初始化或者显式初始化
5.构造代码块执行
6.构造函数执行
7. 堆内存中对象地址赋值给占内存中引用变量
请问这个方法区中的代码是什么时候加载的?
-
1.png
(115.54 KB, 下载次数: 39)
作者: 乔九 时间: 2012-9-3 21:53
当主函数中创建类的对象的时候
作者: 杨习平 时间: 2012-9-3 22:28
1:Person p = new Person();在内存中做了这些事情
(1)将Person.class文件加载进内存中。
(2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
(3)在堆内存给对象分配空间。
(4)对对象中的成员进行默认初始化。
(5)对对象中的成员进行显示初始化。
(6)调用构造代码块对对象进行初始化。(如果没有就不执行)
(7)调用构造方法对对象进行初始化。对象初始化完毕。
(8)将对象的内存地址赋值给p变量,让p变量指向该对象。
class Person
{
String name = "itcast"; //null
Person(){
name = "hello";
}
}
看完这个 你就明白,
作者: 杨习平 时间: 2012-9-3 22:53
我是已经在主方法中定义和实例化了一个Person的对象p,它就已经开辟空间,存放在堆内存中,这个时候他是提前已经new 好了的,
接着可以赋给它值,他这个时候已经是有地址值,负责能被实例化出来吗,它就是有空间的。
你多理解吧!
作者: 刘明月 时间: 2012-9-3 23:09
你红色圈中的部分为方法区,也称为静态区,里边的数据时随着类的加载而加载的,也就是说,只要类出现,并使用了类中的内容,那么此方法区中的代码就开始加载了,如果出现了类但是指向为空,如你题目中的主函数中如果写有Person p=null虽然类出现了,但是没有使用类中的内容,那么方法区中也是不会加载任何内容的,而成员是随着类的创建而加载的,如Person类的String name,int age,setName(),speak()这些成员是随着类的创建而出现的,就是说new 出来的Person("z",20)对象的出现,这些成员变量才被加载的,最后得出的结论就是;方法区是只要类出现并使用了类中的内容(例:Person.country)就加载进内存了,而栈内存的数据时随着对象的出现而被加载的
作者: 郭阳 时间: 2012-9-3 23:26
从主函数第一个出现类名的地方(无论是出于什么目的),就会在内存中加载这个类,这样说是不是更明白一点
类加载之后,方法区内会首先加载静态代码块!来初始化这个类
然后方法区内加载此类中的静态函数和静态成员。(即你代码中的country和showCountry())
这都是在对象创建之前完成的动作。
至于方法区中剩下的(即你代码中的setName()、speak())非静态函数,是随着对象的创立而被加载进方法区的。
以上就是你所问的方法区中代码的加载过程,栈内存和堆内存的就不再赘述。
作者: 唐志兵 时间: 2012-9-4 09:54
本帖最后由 唐志兵 于 2012-9-4 09:57 编辑
<<think in java >>书中对于对象创建过程的描述:
1. 当首次创建类型为MyClass的对象时(构造器可以看成静态方法),或者MyClass类的静态方法/静态域首次被访问时,Java解释器必须查找类路径(classpath环境变量),以定位MyClass.class文件。
2. 然后载入MyClass.class(这将创建一个Class对象), 有关静态初始化的动作都会执行。因此,静态初始化只在Class对象首次加载的时候执行一次。
3. 当你用new MyClass()创建对象的时候,首先在堆上为MyClass对象分配足够高的存储空间。
4. 这块存储空间会被清零,这就自动的将MyClass中的所有基本类型数据设置成了默认值(对于数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
5. 执行所有出现于域定义处的初始化动作。
6. 执行构造器。
作者: 徐传任 时间: 2012-9-16 18:03
bucuo..........
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |