值传递和引用传递引发的思考

刚刚接触这个值传递和引用传递的时候经常容易造成混淆,让我们来深入的分析一下,首先看一下Java的运行机制
值传递和引用传递引发的思考
看上面这个图,由于java语言不会被操作系统识别,会先经过编译器进行编译成.class文件,然后各种类会放在方法区,栈和堆里面元素会根据方法区中那些类当作蓝图来设计。然后就来创建对象,创建的对象会放在内存里
就像这个语句Person a=new Person();这句话,首先理解这个等于号,这个=号的意思就是new向堆中申请内存,这个等于意思就是将堆中的地址传到占栈中,这个就是值传递。
来看一下一个非常容易出错的地方
值传递和引用传递引发的思考
这段代码,你会发现他会输出2000,因为c和b用的是同一个内存地址,c.set(A)修改了之后,因为b也用的是这个地址,所以b.a输出的是2000;
但是你如果demo1 c=new demo1();结果就不一样了,因为有new的存在,会向堆中申请一个新的内存,然后将a内存地址中的内容复制过来,再改变c.a,不会影响b.a的值。所以说Java中的都是值传递。