相信大家有时候在读代码的时候应该都会有以下情况:
- 这个对象本定义在上面,乱跑什么?怎么又到下面去了?
- 欸?我明明改变了这个对象的值,怎么没变呢?
要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要对其内存的状况要有些了解。
在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是无实例化的意思。这个问题是指创建一个堆内存所出现,并且此问题只会出现在引用对象类型。
内存问题会导致很多问题的出现,想要读懂代码,学会内存分析是第一步,下一步是引用分析。
引用分析会在下一节来分享,感谢观看。