黑马程序员技术交流社区
标题:
对象实例化过程
[打印本页]
作者:
狼王
时间:
2013-6-9 08:33
标题:
对象实例化过程
本帖最后由 狼王 于 2013-6-9 14:49 编辑
静态代码块,构造代码块,构造函数在初始化时执行的顺序?
作者:
张歆明
时间:
2013-6-9 08:51
************************************************
静态代码块,构造代码块,构造函数在初始化时执行的顺序?
************************************************
执行顺序就是静态代码块--- 》构造代码块----》构造函数
为了不发生歧义 举一个例子(毕老师总结)
Person p =new Person();
(1). 因为new的时候用到了Person.class 如果是第一次用到Person 则JVM会先找到Person.class 并加载到内存 (
就执行一次
))
(2). 如果该类存在静态代码块,执行
静态代码块
(静态代码块的执行目的就是为整个类进行初始化
就执行一次
)
(3). 在堆内存中开辟空间,分配内存地址
(4). 在堆内存中建立对象的属性(非静态),并进行默认初始化(堆内存中的成员变量都有默认值)
(5). 对成员进行显示初始化
class Person{
private int age; //只有默认初始化 初始化为0
private String name ="Benjamin";//先默认初始化为null, 再显式初始化为Benjamin
}
(6). 对对象进行
构造代码块
初始化
(7). 对对象进行对应的
构造函数
初始化
(所有该类的实例在初始化的时候 都要先构造代码块初始化 无论你调用的是哪一种构造方法
每一次都走相同的构造代码块 所以 构造代码块是所有对象共性的初始化 调用的各自的构造函数是个性的初始化)
(8). 将内存地址赋值给栈内存中的p引用变量
作者:
librazeng
时间:
2013-6-9 12:53
本帖最后由 librazeng 于 2013-6-9 13:06 编辑
1.先执行静态代码块随着类的加载而加载,先于对象而存在,类初始化时自动执行一次。2.然后执行构造代码块
3.最后执行构造函数
示例:
public class TestDemo
{
static{//静态代码块
int a=10;
System.out.println("静态代码块a="+a);
}
public TestDemo()//构造函数(方法)
{
int a=9;
System.out.println("构造函数a="+a);
}
{ //构造代码块
int a=8;//未创建对象,不会运行.
System.out.println("构造代码a="+a);
}
public static void main(String []args)
{
System.out.println("运行结果");
new TestDemo();
}
}
运行结果:
静态代码块a=10
运行结果
构造代码a=8
构造函数a=9
复制代码
作者:
袁梦希
时间:
2013-6-9 14:45
楼主你好 如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e102:}
作者:
狼王
时间:
2013-6-9 14:46
袁梦希 发表于 2013-6-9 14:45
楼主你好 如果帖子的问题已经解决,请把帖子的类型改为“已解决”。 ...
好的,谢谢提醒。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2