java中类加载的过程6_java类加载、对象创建过程

类加载过程:

1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容

3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内

4, 加载静态内容:

4.1、把.class中的所有静态内容加载到方法区下的静态区域内

4.2、静态内容加载完成之后,对所有的静态变量进行默认初始化

4.3、所有的静态变量默认初始化完成之后,再进行显式初始化

4.4、执行静态代码块(注:静态代码块与静态变量显式初始化无先后顺序,与代码顺序相关,如静态代码块在上,则先加载代码块)

5,整个类的加载就完成了。

对象创建过程:

1, 在堆内存中开辟一块空间

2, 给开辟空间分配一个地址

3, 把对象的所有非静态成员加载到所开辟的空间下

4, 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化

5, 所有非静态成员变量默认初始化完成之后,调用构造函数

6, 在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数中书写的代码

6.1、隐式三步:

1,执行super语句

2,对开辟空间下的所有非静态成员变量进行显式初始化

3,执行构造代码块(注:代码块与非静态成员变量显示初始化无先后顺序,与代码顺序相关,如代码块在上,则先加载代码块)

6.2、在隐式三步执行完之后,执行构造函数中书写的代码

7,在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象

总结类中能书写的成员

栈: 用来运行函数。可以存储局部信息

特点:先进后出

堆:用来存储实体(被new创建出来的)。

特点:

1,  每一个实体所开辟的空间都有一个地址

2,  每一个实体中存储的数据都有一个默认初始值

方法区:存放class和static。 方法区其实是由N多个小的区域构成。有存放非静态内容的非静态区域,还有存放静态内容的静态区域,还有存放常量的常量池 等

class  ABC

{

非静态成员变量

静态成员变量

非静态成员函数

静态成员函数

构造函数:ABC(...){...}

静态代码块: static {...}

构造代码块 :  {...}

}

图解调用过程:

82d5b9f8090de8757120947c970727e6.png

父子类加载及创建对象过程代码实例:

//子类

public class Insect {

private int i = printInit("Insect:i");

protected int j;

protected static int x1 = printInit("static Insect.x1 initialized");

static{

System.out.println("Insect静态代码块");

x1=80;

}

Insect() {

System.out.println("基类构造函数阶段: i = " + i + ", j = " + j);

j = 39;

System.out.println(x1);

}

static int printInit(String s) {

System.out.println(s);

return 47;

}

}

//父类

public class Beetle extends Insect{

{

k=90;

}

private int k = printInit("Beetle.k initialized");

protected static int x2 = printInit("static Beetle.x2 initialized");

public Beetle() {

System.out.println(k);

}

public static void main(String[] args) {

Beetle b = new Beetle();

}

}

运行结果:

a58d92ef902817c416fd1f92cdb540af.png

对象创建过程代码和注释:

classPerson {

intage;

Person(intage) {

this.age = age;

}

}

classStudent extendsPerson {

// 2,对开辟空间下的所有非静态成员变量进行显式初始化

String school = "abc";

Student(String school, intage) {

// 1,执行super语句

super(age);

// 4、在隐式三步执行完之后,执行构造函数中书写的代码

this.school = school;

}

{

// 3,执行构造代码块

System.out.println("Student code block");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值