Java之对象内存分析

发布时间 2023-10-04 11:35:54作者: Melo70000

相信大家有时候在读代码的时候应该都会有以下情况:

  • 这个对象本定义在上面,乱跑什么?怎么又到下面去了?
  • 欸?我明明改变了这个对象的值,怎么没变呢?

要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要对其内存的状况要有些了解。

在java中,类是属于引用数据类型,而引用数据类型最大的难点在于数据的内存管理,在操作过程中内存的变化会比较多。

在用以上代码内存分析之前,先来了解两种常见内存划分

- 堆内存:保存对象的具体信息。堆内存通过关键字new来开辟空间。

- 栈内存:保存的是所指堆内存的地址。再通过堆内存找到对象的信息。
(栈就相当于客栈嘛,找到客栈具体地址,就能找到客栈主人。便于理解)

画个图更直观的了解一下

来看一段简单代码:

class Person{   //定一个“个人”类
	String name;//人的姓名
	int age;    //人的年龄
	public void tell(){
		System.out.println("姓名:"+name+" 年龄:"+age);
	}
}
class Test{
	public static void main(String []args){
		Person per = new Person();//创建一个对象
		per.name = "小明";//该对象姓名
		per.age = 18;//该对象年龄
		per.tell();
	}
}

这个是一个简单的java类,运行结果如下:

还是用图来解释:

对于Person per = new Person();这句话中,关键字new是用来开辟一个新的堆内存来存放数据,这里我们目前还没有放数据,所以所定义的属性首先保持默认值。

紧接着per.name = "小明"; per.age = 18;这两句就是把所设置的数据放入堆内存。

我们在【Java面向对象修习之路 第一节】什么是对象中“通过类声明一个对象”可知道实例化对象是有两种方法。在上面的的代码中属于第一种情况:声明并实例化
第二种情况是分布进行,所以实例化的代码将会变成:

Person per = null;//先声明
per = new Person();//后实例化

然后赋值语句一样

注意!!!
所有对象在调用类的属性和方法都必须在完成实例化之后,若 没有 进行实例化,则会出先以下报错:

其中NullPointerException是无实例化的意思。这个问题是指创建一个堆内存所出现,并且此问题只会出现在引用对象类型

内存问题会导致很多问题的出现,想要读懂代码,学会内存分析是第一步,下一步是引用分析。
引用分析会在下一节来分享,感谢观看。