1.java内存分为栈内存和堆内存;基本数据类型存放在栈内存中,引用数据类型是把指向引用变量的地址存入栈内存,把引用变量的真正内容存入堆内存。
2、Java参数,不管是基本数据类型还是引用类型,传递的都是副本(java传参是传引用还是传值,网上争论很多)
3、如果参数类型是基本数据类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值。因为在函数中的变量是局部变量,this.类中成员变量才是类变量。4、如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。
如果在函数中没有改变这个副本的地址,而是通过地址改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。除非用this.a=其他对象或this.a=new xxx()表示,直接对类属性进行操作才会改变原始值。
5、在 Java 应用程序中永远不会传递对象,而只传递对象引用(指栈内存中对应的地址)。因此是按引用传递对象。Java应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
-
对象是按引用传递的;
-
Java 应用程序有且仅有的一种参数传递机制,即按值传递;
-
按值传递参数意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本;
-
按引用传递参数意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。