对象内存分析
类本身属于引用类型,所以对于引用类型就必须为其进行内存分析,那么在分析之前,首先给出两块内存空间的概念:
- 堆内存空间(Heap):保存的是对象中具体的属性信息;
- 栈内存空间(Stack):是保存的堆内存的地址数值,所以现在可以简化一点,假设保存在栈内存中的是对象名称,一个栈内存只能够保存一块对应的堆内存空间地址
所以现在按照以上的分析,就可以得出如下的内存关系图
per.name="张三";per.age=30;
改的是栈内存对应堆内存的内容。
new出现就是开辟一个堆内存空间,上面的图很重要,这张图能看明白吧,很多人看到这都觉得看会了,到最后都给忘了,你能把引用传递掌握了,Java的需求掌握了百分之八十,其余百分之二十才是基本概念,引用传递没回,Java就跟没会一样。
引用数据使用与C语言是完全一样的,所以这个是Java的灵魂所在。实际上对象的产生格式本次只是用了一种,还有另外一种分步的方式完成。如下图:
伴随终身的注意:关于引用数据类型操作存在的重要问题
。
理论上当对象开辟堆内存(实例化对象)那么属性才会进行内存的分配,那么如果说使用了没有实例化的对象(也就是去掉这一句:per=new Person()
)呢?相当于只声明了对象,没有对象实例化,于是这时候编译没有问题(代码没错),但是程序执行出错:此时返回“NullPointerException”异常,翻译就是空指向异常。这个异常只有引用类型会出现,出现的原因只有一点:使用了没有开辟堆内存空间的引用对象
。异常如下:
既然可以开辟一个对象,那么就可以开辟两个对象。如下图: