黑马程序员技术交流社区

标题: 程序的执行顺序问题? [打印本页]

作者: 全海波    时间: 2012-7-6 14:27
标题: 程序的执行顺序问题?
本帖最后由 全海波 于 2012-8-4 09:51 编辑

class  PersonDemo
{
        public static void main(String[] args)
        {
                //当new一个对象时候,那么对象就有了属性,接下来就是默认初始化
                Person p = new Person();
        }
}
class Person
{
        //成员变量
        String name;//请问class文件加载进内存时,如果没有建立对象,这些成员变量早就优先于一下其他的的成员存在?????????
        int age;
        static String country = "CN";
        //构造函数
        Person()
        {
                ..................
        }
        //构造代码块
        {
           //里面是给对象初始化的内容
          ..................        }
         static
        {
                 //给类进行初始话的内容
           ........
        }
}
/*
new 找  .class 文件,将其从硬盘加载进内存空间
*/
作者: 赵志勇    时间: 2012-7-6 14:41
首先:Person p = new Person();
你不新建对象,类怎么会加载进你内存呢?新建对象的时候才会调用.class文件的,才会加载,不引用.class文件哪来的成员变量?
其次:如果建立过对象Person p1 = new Person();  Person p2 = new Person();
新建p1的时候.class文件加载过一次,那么p1的成员变量是不是先于p2存在的,或者p2的成员变量,是不是先于p2存在,我想在才是你想问的吧
很明显,先建p1,p1的成员变量肯定先于p2存在,那么新建p2的时候p2的成员变量是不是先于p2存在?这个我想已经不是加载.class顺序的问题了,是应该好好看看老毕视频里面的类创建对象过程的问题了!!建议还是多看视频好,视频讲得比我说得明白多了!!不过可以跟你说一下,p2是引用,成员变量是对象身上的动向,先建对象再指向引用~~~还有,不新建对象不加载.class文件,加载过的,如果不是短期再新建对象,.class文件也会被清空出内存,成员变量和对象的生命周期是一样的!希望能帮到你!!
作者: 汤密奕    时间: 2012-7-6 17:00
对象的初始化过程:
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
作者: 游兴钟    时间: 2012-7-6 21:56
本帖最后由 achilles 于 2012-7-6 22:03 编辑

子类对象建立的初始化顺序:父类静态代码块-->子类静态代码块-->父类构造代码块-->父类构造函数-->子类构造代码块-->子类构造函数(对应参数列表的)
另外:成员变量是伴随对象而存在的,只有静态成员的加载才会和类的加载有关,也就是说类加载的同时静态成员也随之加载进内存,这个和是否建立对象无关.




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