java内存图解

java学习1:java内存分析

java内存各部分的概念

  1. 栈:连续存储的空间,遵循后进先出的原则,存放局部变量

  2. 堆:不连续的空间,存放new出来的东西,也就是类的实例

  3. 方法区:方法区在堆空间内,用于存放

    1.类的代码信息

    2.静态变量和方法

    3.常量池(字符串敞亮等,具有共享机制)

4.java中除了基本类型,其余都是引用类型

5.数据类型的默认值

		基本数据类型默认值:
		
		数值型:0
		
		浮点型:0.0
		
		布尔型:false
		
		字符型:\u0000
		
		引用类型:null

6.变量初始化

成员变量可不用初始化,系统会自动初始化

局部变量必须由程序员显示初始化

实例分析

创建Student,Computer,Test三个累

1.创建Reading类

public class Reading {
	public int time;
	public  String reading;
	public Test test;
	public void read(){
	System.out.println("我正在读书");
	}
}

2.创建Test类

public class Test {
	public int time;
	public String running;

}

3.main方法

 public static void main(String[] args) {
    Reading reading=new Reading();	 
//基本类型变量直接赋值
    reading.time=2019;
//该常量值直接引用常量池的地址即可
    reading.reading="盗墓笔记";
//  reading.read();
    Test test=new Test();

    test.time=2020;
    test.running="晨跑";
//将test对应的new Test的地址赋值给reading中的成员变量,所以二者指向的是同一个地址
    reading.test=test;

    test.running="夜跑";
    System.out.println(reading.test.running);
}

代码分析:

main方法从上到下,从左到右进行分析

##Reading reading=new Reading() ##
首先java虚拟机去方法曲寻找有没有Reading的代码信息,有就直接加载,没有就从类加载器加载到方法曲中
Reading reading是局部变量左移放到栈中。new Reading放到堆中,然后在方法区建立代码信息,最后将堆中new Reading的地址赋值给reading,通过地址引用

思考?
test.running=“夜跑”;,这个会改变reading中成员变量test的值吗?

会,因为二者指向的是同一个地址;
常量也是从常量池中获取,所有地址也是相同的

向这位大佬学习:https://blog.csdn.net/qq_36743482/article/details/78527312

你可能感兴趣的:(java基础学习)