基础知识点
1.Java地址是由16进制标记的;
2.16进制运算:
示例:2B=2*16+11=43 (B=11);
3.Static variable/Constant =>special 从内存中比较低位置比如1000(16进制)的地址开始向后寻址;
4.Dynamic variable/new =>heap 从内存中比较高位置比如
2000(16进制)的地址开始向后寻址;
5.Local variable/Parameters =>stack 从内存中最高位置
位置FFFF(16进制)的地址开始向前寻址;
注:当然存在4与5重叠的情况,如果有重叠,系统将崩溃,大多数时候不会出现这种情况;
代码及解析
下面用代码解释上述含义:
//可执行类
public class Point {
public Point(int x, int y) {
px = x;
py = y;
}
public void move(int dx, int dy) {
px += dx;
py += dy;
}
private int px;
private int py;
}
//测试类
public class Test {
public static void main(String args[]) {
Point p1 = new Point(2, 3);//标记1
Point p2 = new Point(4, 5);//标记2
p1.move(10, 11);//标记3
}
}
针对上面这段代码中Test类运行的过程看一下都发生了哪些:
1.当程序运行到标记1时,将在stack中产生指针p1以及heap中产生对象1;
2.当程序运行到标记2时,将在stack中产生指针p2以及heap中产生对象2;
3当程序运行到标记3时,将产生新的栈针,即在stack中产生黄色区域部分,并对应heap中的对象发生蓝色部分的变化,产生了调用的结果,当此标记执行结束后,stack中黄色的部分将产生垃圾回收。