对象内存分析


       类本身属于引用类型,所以对于引用类型就必须为其进行内存分析,那么在分析之前,首先给出两块内存空间的概念:

  • 堆内存空间(Heap):保存的是对象中具体的属性信息;
  • 栈内存空间(Stack):是保存的堆内存的地址数值,所以现在可以简化一点,假设保存在栈内存中的是对象名称,一个栈内存只能够保存一块对应的堆内存空间地址

       所以现在按照以上的分析,就可以得出如下的内存关系图

       per.name="张三";per.age=30;改的是栈内存对应堆内存的内容。
       new出现就是开辟一个堆内存空间,上面的图很重要,这张图能看明白吧,很多人看到这都觉得看会了,到最后都给忘了,你能把引用传递掌握了,Java的需求掌握了百分之八十,其余百分之二十才是基本概念,引用传递没回,Java就跟没会一样。
       引用数据使用与C语言是完全一样的,所以这个是Java的灵魂所在。实际上对象的产生格式本次只是用了一种,还有另外一种分步的方式完成。如下图:

       伴随终身的注意:关于引用数据类型操作存在的重要问题
       理论上当对象开辟堆内存(实例化对象)那么属性才会进行内存的分配,那么如果说使用了没有实例化的对象(也就是去掉这一句:per=new Person())呢?相当于只声明了对象,没有对象实例化,于是这时候编译没有问题(代码没错),但是程序执行出错:此时返回“NullPointerException”异常,翻译就是空指向异常。这个异常只有引用类型会出现,出现的原因只有一点:使用了没有开辟堆内存空间的引用对象。异常如下:

       既然可以开辟一个对象,那么就可以开辟两个对象。如下图:

posted @ 2019-02-27 17:10  AntarcticPenguin  阅读(385)  评论(0编辑  收藏  举报
//开启礼花特效的js