个人理解:所谓内存就是就是存放值的地方
这里有栈和堆的概念:(栈可以理解为客栈,堆可以理解为大客栈,因为住客栈的时候会有记录在几号房住了什么人,那么找这个人的时候只要查询这个这个人的入住记录就可以了,其实就是一个抽象的地址)
栈:存放值,比如123,“zifuchuan”
堆:存放对象和数组
详解:String a = 123 或者 String a = “123”
字母a 是String类的引用 而123这个值赋值给字母a,实际上是在栈内存里放了一个值为123的内存,而a这个引用其实就是指向得值123的地址!(其实个人认为是在 堆里面新建了一个对象,然后对象指向这个栈地址,然后引用指向对象)
Fu fu =new Fu()或者String [] a =new String[]
fu 是Fu类的引用,而new动态给这个对象分配内存!堆里新建了一个对象,而fu这个引用指向了堆的内存!
分析:
栈:String a = 123 是引用指向123这个内存地址,那么String a = 456 后,其实是在栈里新建了一个值为456的内存地址,然后把引用指向了这个456的地址,而123的内存地址其实没变,而对于引用而言,只是引用换了一个地址而已!再比如String a=123,String b=123,其实是指a和b指向同一个内存地址,那么如果String a =456了,其实b的引用是没变的,只是a换了一个地址而已,也就是说栈里面的内存是在没有释放的前提下是不会被修改的只有新建
堆: Fu fu =new Fu() 引用指向堆内存,而如果 Fu fu =new Zi() 的话,是把引用换了一个地址而已!假如Fu fu =new Fu() 和Fua fua =new Fu(),因为这个Fu()方法是一个构造函数,而构造函数其实就是初始化类属性的作用,那么创建这个对象的同时也拥有了一个属性的副本,而构造函数的重载只是构造函数的版本的不同!而且修改fu和fua中的一个是对另一个不影响的!注意:如果有另一个对象b,fua=b的话,其实是fua=b=new B()那么在这种情况下,这两个引用指向相同的对象,也就是说修改其中一个对象的构造的话是会影响另一个引用的!Fu fu = null的话,其实这个fu引用和对象就没有一毛钱关系了!
对比new和= new动态分配内存,=指向对象
总结:内存总是引用指向堆对象,堆对象指向栈值。