一、 对 Person p=new Person()的理解
- 要理解这个问题,首先要知道整个过程中内存中发生了什么!我们知道,内存中我们最常用的就是三个:栈、堆、方法区。其中对于基本值类型和引用变量(就是User user;中的user)来说,它们是存储在栈内存中的;而new出来的东西都是存储在堆内容中;而成员变量和成员方法在随着类的加载存储在方法区中。
- Person p=new Person();其实是两行代码的合并,我们将其分开再结合内存可以更好的理解这个问题。 Person p=new Person();其实等价于 Person person; person=new Person();文章最后会简单讲一下Person person = new Person(); Person person=null;的区别
- 下面我们就可以去更深入的去理解这个问题了。创建一个对象都在内存中做了什么事情?
- 3.1.JVM先将硬盘上指定位置的Person.class文件加载进内存(如果该对象有直接父类则会先加载父类)----方法区也称为数据区。
- 3.2.执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main 方法的栈区分配了一个变量p。— 这个可以将p看成一个引用变量(存在于main的栈内存中)
- 3.3执行new Person():在堆内存中开辟一个实体空间,然后将成员变量和成员方法放在new实例中。将该对象的成员变量默认实例化,int类型为0,String类型为null…,同时产生一个堆内存首地址值。
- 3.4.调用该实体对应的构造函数,进行构造函数初始化
- 3.5.将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
对于上面的3.2和3.3,我们要知道程序的执行过程和执行过程中内存中发生的变化(其实主要是相关方法的压栈和弹栈的过程,当最后main方法弹栈跳转栈内存的时候,说明程序彻底执行完成了)。这个执行过程网上有很多好的文章来讲解这个问题,本人就不在这里献丑了。下面我为大家推荐一篇博文(自认为程序的执行过程非常重要,对于理解成员变量、局部变量的初始化问题、变量的作用域、方法的执行等都非常重要,大家一定要理解)。
对象实例化过程:[https://blog.csdn.net/weixin_44989801/article/details/107404653]
这里还是为大家贴出一张图,来简要的展示一下:
上面就是Person person =new Person()的简单分析。
二、3. Person p=new Person() 和 Person p=null
其实这个问题很简单,当我们通过上面的分析之后,可以很轻易的区分这两行代码。但是之前不知脑子咋啦,就是转不过弯来,所以一并在这里记录下来。
1.首先 Person p=new Person() 会在栈、堆内存中都开辟一块空间,然后把堆中该部分的 地址值赋值给p变量,此时p不是null,因为p存储的是地址值。
2.Person p=null; 这个只会在堆内存中开辟空间
对于第一种声明方式p不是null 这个一定要注意。
Person p;这个过程只是在栈内存中开辟一块空间(其他的什么也没有做),在执行完new Person();这行代码后会在堆内存中开辟一块空间,同时分配一个指向它的内存首地址值,并赋值给p;
三、成员变量和局部变量的区别
这里还是直接贴一张图比较好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)