A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑马 黑马帝   /  2012-9-3 21:46  /  2761 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马小龙 于 2012-9-4 10:07 编辑

对象的初始化过程:
      1.JAVA虚拟机加载类文件
      2.  static代码块执行
      3.开辟堆栈空间(对象在堆内存中创建并且有地址,引用变量在栈中创建)
      4.属性默认初始化或者显式初始化
      5.构造代码块执行
      6.构造函数执行
      7. 堆内存中对象地址赋值给占内存中引用变量

请问这个方法区中的代码是什么时候加载的?

1.png (115.54 KB, 下载次数: 43)

1.png

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个! 7楼答案更为直观。

查看全部评分

7 个回复

正序浏览
bucuo..........
回复 使用道具 举报
本帖最后由 唐志兵 于 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. 执行构造器。
回复 使用道具 举报
从主函数第一个出现类名的地方(无论是出于什么目的),就会在内存中加载这个类,这样说是不是更明白一点
类加载之后,方法区内会首先加载静态代码块!来初始化这个类
然后方法区内加载此类中的静态函数和静态成员。(即你代码中的country和showCountry())
这都是在对象创建之前完成的动作。

至于方法区中剩下的(即你代码中的setName()、speak())非静态函数,是随着对象的创立而被加载进方法区的。

以上就是你所问的方法区中代码的加载过程,栈内存和堆内存的就不再赘述。
回复 使用道具 举报
你红色圈中的部分为方法区,也称为静态区,里边的数据时随着类的加载而加载的,也就是说,只要类出现,并使用了类中的内容,那么此方法区中的代码就开始加载了,如果出现了类但是指向为空,如你题目中的主函数中如果写有Person p=null虽然类出现了,但是没有使用类中的内容,那么方法区中也是不会加载任何内容的,而成员是随着类的创建而加载的,如Person类的String name,int age,setName(),speak()这些成员是随着类的创建而出现的,就是说new 出来的Person("z",20)对象的出现,这些成员变量才被加载的,最后得出的结论就是;方法区是只要类出现并使用了类中的内容(例:Person.country)就加载进内存了,而栈内存的数据时随着对象的出现而被加载的
回复 使用道具 举报
我是已经在主方法中定义和实例化了一个Person的对象p,它就已经开辟空间,存放在堆内存中,这个时候他是提前已经new 好了的,
接着可以赋给它值,他这个时候已经是有地址值,负责能被实例化出来吗,它就是有空间的。
  你多理解吧!
回复 使用道具 举报
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";
                }
        }
看完这个 你就明白,

点评

我感觉你第二句话有点问题。我觉得: p在没被赋于对象的地址值时,是不开辟空间的。  发表于 2012-9-3 22:35
回复 使用道具 举报
当主函数中创建类的对象的时候
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马