http://www.cnblogs.com/dolphin0520/p/3803432.html
当程序执行时,需要生成某个类的对象,Java执行引擎会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象,如果已经加载,则直接生成对象。
程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象
//类的加载过程
class member{
member(char ad){
System.out.print("初始化成员变量:");
System.out.println(ad);
}
}
class A {
member a=new member('A');
A(){
System.out.println("执行A类的构造函数");
}
}
class B extends A{
member b=new member('B');
B(){
System.out.println("执行B类的构造函数");
}
}
public class nnn{
public static void main(String args[]){
B b=new B();
}
}
输出结果:
初始化成员变量:A
执行A类的构造函数
初始化成员变量:B
执行B类的构造函数
在子类的构造器中如果没有使用super关键字,系统会自动调用父类的无参构造器,如果父类没有无参构造器,发生编译错误,此时应该在子类的构造器中使用super关键字调用的父类的有参数构造器。
方法区:整个过程中唯一的元素即class.static变量,至于class变量,即类的类型信息,包括类的成员方法
java堆:存放类的实例对象本身,这个本身包括很多引用,指向对象对应的类的方法在方法区中的地址,用于实例调用类的成员方法
Java栈:保存局部变量,包括对象的引用(指向java堆区的实例对象本身)和一些基本数据类型(int ,char)
本地方法栈:每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据: