标签:this 代码块 his 创建过程 也会 面向对象 面向 test jvm
1:构造函数
判断下列程序的执行结果:
class Demo { static Demo demo = new Demo(); Demo(){ System.out.println("构造函数"); } } class Test { public static void main(String[] args) { new Demo(); } }
分析:类内的同类名静态变量在加载类时就已经创建,所以没有问题。
判断下列程序的执行结果:
class Demo { Demo demo = new Demo(); Demo(){ System.out.println("构造函数"); } } class Test { public static void main(String[] args) { new Demo(); } }
分析:创建对象的时候,先开辟空间,然后给非静态成员变量demo分配空间,默认初始化,值为null,然后调用构造函数进栈,构造函数进栈执行的时候明显要执行隐式三步,隐式三步的第二步,是给变量demo赋显示值,所以此时又要创建对象。
在创建对象时都不会完成,都只能停留在隐式三步的第二步。
2:隐式三步
第一、super调用父类的构造函数。
第二、给对象空间中的变量赋显示值。
第三、执行构造代码块。
因为上面这三步即使在构造函数中没有书写,也会执行,所以叫做隐式三步;(如果构造函数中通过this语句调用了其他构造函数,这个函数中就没有隐式三步,而是在被调用的那个函数中存在隐式三步)
隐式三步完成之后,才来执行构造函数中的代码;
3:构造代码块与静态代码块
静态代码块:用static修饰的代码块;
class Test
{
static { System.out.println("静态代码块。。。"); }
}
构造代码块:前面不需要使用static修饰;
class Test { { System.out.println("构造代码块。。。"); } }
4:累的加载过程
JVM发现要使用一个类,就去方法区去找这个类。
1:找到了直接使用
2:没找到就去硬盘上找这个类,寻找的地址是由classpath配置的地址决定的,如果未配置classpath,就在当前路径找
3:找不到就报错
4:找到了,就加载到内存的方法区中,
1:首先加载静态成员变量到静态区域,非静态成员变量到非静态区
2:成员加载完成,为静态成员分配空间。
3:按顺序给所有的静态成员变量赋显示值,同时执行静态代码。
4:所有静态代码块执行完毕,类加载完成
5:对象的创建过程
1:JVM遇到new关键字,就去内存中开辟空间。
2:在空间中为所有非静态成员分配空间,赋默认值。
3:调用相应的构造函数
4:构造函数进栈后,执行隐式三步
5:执行构造函数中代码
6:构造函数出栈,对象创建完成。
标签:this 代码块 his 创建过程 也会 面向对象 面向 test jvm
原文地址:http://www.cnblogs.com/wuya-study/p/6442574.html