程序结构
java程序在操作系统中是一个进程,进程中有栈和堆,栈不能被别的线程读写,堆可以,多线程指的就是操作堆中的数据。栈中存放的是变量,堆中存放的是java的各种类和类的数据。
其实内存中存放的所有程序都是一堆数据结构。
c语言的栈是物理栈
java的栈是计算栈(逻辑栈)
堆中的指针直线实例
java刚开始运行
- 扫描和加载类–详细说就是扫描整个程序,然后在内存中建立类的存储空间,初始化类中的静态变量和静态方法和实例方法
java中new一个类的时候内存中发生了什么呢
- 实例化,计算需要的存储空间—–其中实例字段存储在实例空间中,实例字段也叫作局部变量。其中方法的形参也属于实例字段
- 分配所需的实例化空间,如果内存不足,GC垃圾回首器回首,其中实例的结构如下
- 默认初始化实体部分
- 构造函数初始化—-构造函数初始化包括当前类的构造函数和继承的父元素的构造函数和,Class类,Object类的构造函数等一系列的初始化
实例的存储结构如下:
mark word(运行时信息,包括lock锁) |
指针(指向类) |
实体部分(默认初始化为0) |
实体部分(这就是为什么XX不需要初始化的原因) |
8的倍数空间的补齐 |
下面是类的结构,和实例的结构非常像:
mark work部分 |
指针指向Class类 |
super部分 |
!!!存储部分??(存储的静态变量和静态方法) |
Class类(反射类)
mark word部分 |
指针(指向自己) |
super(Object类) |
1. 在系统用到静态变量时,因为静态变量已经初始化好了,就在类中,直接引用即可。引用方法:通过类名比如A.b引用。类名在内存中对应的是指向类的数值常量。
2. 系统使用一个方法时,先到类中找是否有这个方法,如果有,那么使用它。
构造函数
java有静态构造函数和普通构造函数
初始化的时候执行静态构造函数初始化静态变量,普通构造函数初始化非静态变量。
如果变量默认又赋值如:static int a = 5;
在解析器解析的时候会写成这种形式:static int a; a=5;
其中a=5;的部分被写在了静态构造函数中。如果构造函数中不写任何代码,那么解析器将会对其中的赋值代码进行一些优化,如果在构造函数中写入了代码,那么就不会有优化。
静态构造函数没有形参,普通构造函数默认加上this形参
静态构造方法初始化类
实例构造方法初始化实例(可重载)
子类的构造方法中如果没有super,解析器会默认加上一个参数为空的super()来运行父类的无参构造函数。如果父类没有无参构造函数,就会报错。
java中除了类在内存中的图,还有多态的图和接口的图。我们在以后记录。