1、字节码与类的创建

1、java、C语言、C++语言常识普及
java是一门什么样的语言?跨平台、可移植性,这两个词在初学java的时候就经常看到,但是究竟应该怎么理解?
首先要明白C语言、C++在linux都是可直接运行的,在Window系统呢,是通过VC运行的,而java呢?java在通过jdk的编译环境编译后变成字节码文件,也就是.class文件,然后就是jvm(虚拟机)的事了,在任何操作系统上,只要有jvm,都可以运行java文件。

2、java文件的执行过程
通过javaC将文件变为.class文件,然后通过类加载器加载进入jvm
类加载器执行过程:
a.加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
加载.class文件->验证(验证文件格式,是否符合class文件格式规范;验证元数据:判断是否符合java代码规范;验证字节码:判断文件是否有危害等;符号引用验证:验证引用的是否存在,例如extent)->准备:加载数据值,给静态资源分配空间,设置默认值 ->初始化:给static变量赋值

3、代码解读
(1)创建对象解析

public class Hello{
	public static void main(String[] args){
		Hello hello = new Hello();
	}
}

a.在jvm运行代码时,看到main方法,会在线程栈中开启一个线程,然后接着往下扫描,扫描到new关键词,便会在main主线程下声明对象Hello hello,然后会在jvm的堆内存中申请一块内存空间,将实例方法、实例变量加载到堆内存中,这个就是栈堆
而对象声明与new之间的“=”,则是指向作用
b.在堆中创建对象的时候执行顺序:
-> 加载实例信息进入堆内存
-> 执行构造方法方法
(2)静态资源

public demo{
	static int num = 3;
}

a.字节码文件通过类加载器后到jvm开始执行,但是其实这里的代码在类加载器就可以执行完毕,可以看执行步骤
加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
在加载验证后,准备的时候会将static变量的值给一个默认的初始值,然后再初始化将3赋值给num

4、关于static的方法不能访问非static非实例,也就是不能访问没有static修饰的对象
因为在执行过程,没有static的变量,定义的变量是会进入堆内存,而有static方法,在方法区执行后,是直接进入线程堆内存的。

另外关于这部分,有一篇博客写的特别详细点击跳转

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值