黑马程序员技术交流社区
标题:
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