对象初始化过程
1.加载类
2.堆内存分配空间
3.属性进行默认初始化
4.调用构造函数----->1.构造函数默认第一句super(); 2.显示初始化 3.构造代码块初始化
5.调用父类构造函数----->同上
6.属性显示初始化
7.构造代码块初始化
8.构造函数自定义初始化
注意:不创建对象,构造代码块和构造器都不运行。
运行过程--->new 对象 先执行静态代码块--->在执行构造代码块--->再执行构造代码块里面的内容
加载过程--->先加载静态(...)--->构造函数--->在构造函数里加载构造代码块。
结合实例分析:
class Demo
{
static int i=2;//随着类的加载而加载。加载到方法区中的静态区中。
int j=9;//定义了一个属性,也就是一个成员变量,也叫实例变量。当对象存在时,该变量存在于堆内存的对象中。
static{//静态代码块。随着类的加载而执行。
System.out.println("静态代码块...i="+i);
}
Demo(int a){//带一个int参数的构造函数。
this();//调用了本类中空参数的构造函数。
System.out.println("有参的构造函数...i="+i+",j="+j);
}
{ //构造代码块,定义在类中的代码块,用于给所有对象进行初始化动作的代码块。
System.out.println("构造代码块...i="+i+",j="+j);
}
static void show(){//静态函数。函数中没有访问非静态的成员。
System.out.println("静态show方法...i="+i);
}
Demo(){// 空参数的构造函数。
System.out.println("无参的构造函数..."+",j="+j);
}
}
class Test
{
public static void main(String[] args)
{
Demo d = new Demo(1);//通过Day06.class类文件创建了对象。
int a = Demo.i;
System.out.println("----");
new Demo();
show();
}
public static void show()
{}
}
执行过程解析:
1. 执行静态代码块:静态代码块...i=2
2. 再执行构造代码块:构造代码块...i=2,j=9
3. Demo(int a) 进栈后,第一行this()调用了本类中空参数的构造函数。所以Demo()进栈
4. Demo()第一句默认super(),之后属性显示初始化,构造代码块初始化,以后执行print:无参的构造函数...,j=9
5. Demo()出栈,接着执行Demo(int a):有参的构造函数...i=2,j=9 Demo(int a)出栈 堆内存分配空间释放,等待垃圾回收
6. 执行int a = Demo.i; System.out.println("----");
7. new Demo()调用空参构造函数;
8. 执行构造代码块...i=2,j=9
9.无参的构造函数...,j=9
---------------------- android培训 、 java培训 、 期待与您交流! ---------------------- 详细请查看:www.itheima.com