黑马程序员技术交流社区

标题: static初始化,类的初始化 [打印本页]

作者: 胡遇潮    时间: 2011-12-25 10:12
标题: static初始化,类的初始化
本帖最后由 胡遇潮 于 2011-12-25 16:17 编辑

public class Person {


        public Person()
        {
                System.out.println("gaga! ");
        }

        {
                System.out.println("nihao");
        }
        static
        {
                System.out.println("hello");
        }
       
        public static void main(String[] args)
        {
                Person p = null;
                System.out.println("**********");
                p=new Person();
        }
}
麻烦解释下在内存中分配空间的过程,还有运行过程?
作者: 李楠    时间: 2011-12-25 10:34
java运行时的加载顺序:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。
也就是说  static
        {
                System.out.println("hello");
        }
这部分在程序加载到内存的时候,就执行了。
然后是这一句 Person p = null;这里只是创建了一个类的引用,不调用构造器。
然后是这里 System.out.println("**********");
最后p=new Person();  调用构造器  :
public Person()
        {
                System.out.println("gaga! ");
        }
完成对象的创建过程。



作者: yunqiangshan    时间: 2011-12-25 12:25
依次执行,静态代码块(给类初始化),主函数,构造代码块(给所有对象初始化),构造函数(给相应的对象初始化)
作者: 林铁柱    时间: 2011-12-25 15:12
运行顺序依次为:static{}---->main()---->Person()---->{}


以下是内存分配过程:
1、        因為new用到了Person.class文件,所以會先找多Person.class并加載到內存中。
2、        執行該類中的static代碼塊,給Person.class類進行初始化。
3、   執行 System.out.println("**********");語句
4、        在堆內存中開闢空間,分配內存地址。
5、        在堆內存中建立對象的特有屬性,并進行默認初始化。
6、        對屬性進行顯示初始化。
7、        對對象進行構造代碼塊初始化。
8、        對對象進行對應的構造函數初始化。
9、        對類進行代碼塊初始化
10、 將內存地址付給棧內存中的p變量。
作者: 王胜利    时间: 2011-12-25 16:12
在java中,我们可以用staic对类进行初始化。对类的初始化,仅在类的第一个实例有效,在创建类的第二个实例时不会生效。另外在继承时,如果发现父类也有static,要先调用父类的static初始化代码,然后再调用本身的static初始化代码。接着调用父类的构造函数,然后再调用本身的构造函数。




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