Java运行过程粗略解析

import xxxx.testB
public class testA{
	public static String test = "123";
	public static void main(String args[]){
		testB b = new testB(2, “234);
		b.message();
	} 
}
public class testB{
	int num = 1;
	String name = 'asd';
	public testB(String num, String name){
		this.num = num;
		this.name = name;
	}
		
	public String message(){
		System.out.print(num + "=====" + age);
	}
}
  1. 使用javac命令编译testA,被依赖的类会首先被编译,然后引用,如果被依赖的类已经被编译直接引用,编译之后产生与平台无关的字节码文件(也是01序列组成的文件)
  2. main方法作为该Java程序的入口,其所在类testA的字节码文件首先被加载到方法区,然后在堆中创建一个该对象的java.lang.Class对象,用来封装类在方法区内的数据结构,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。(反射)注:该步称为类的装载
  3. 类的连接
    3.1 验证:检验加载的类是否具有正确的结构
    3.2准备:在方法区中为类变量分配内存并设置类变量默认初始值(即在图中的静态为test类变量区开辟内存并设置null的初始化值)
    3.3 将类中二进制数据中的符号引用替换成直接引用
  4. 类的初始化,主要是对类变量的初始化(对类变量的初始化有两种,一种是直接赋值,一种是静态代码块),既将123赋值给方法区中的类变量test
    注:234步称为类加载或类初始化
  5. 运行到main方法,发现要使用testB,testB被装载进入方法区(重复234步),之后-
    5.1 声明一个testB 类型引用 b
    5.2 在堆内存创建testB对象,
    5.3,给对象中属性默认初始化值
    5.4,属性进行显示初始化(及有没有直接在变量申明后赋值的)
    5.5构造方法进栈,对对象中的属性赋值,构造方法弹栈
    5.6将对象的地址值赋值给b
    注:上述步骤均发生在栈中main方法的区域中
  6. 这时message方法入栈,执行方法,输出2====234,message方法弹栈
  7. main方法结束,程序正常运行结束,该jvm进程结束,该jvm进程在内存中的状态将会丢失

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值