java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
传值的方式传引用。 或者说传值的方式传地址。
你这个问题其实很简单。要搞清楚这个问题,要明白:堆 和 栈。引用是保存在栈上,对象是保存在堆中。引用指向堆上的对象,也就是说引用的值为对象在栈上的内存地址。那么你修改引用时改的是引用的值,也就是让引用指向其它对象。那么应该怎么修改堆上的对象呢?首先你得访问到堆上的对象吧?如何访问到它呢?在C/C++中是通过指针运算符 *p 来访问到指针p指向的堆上的对象的,然后再修改它。那么Java中没有指针运算符,那么怎么办呢?Java中是通过点操作符,也就是 list.add中的那个点,表示先访问到list这个引用指向的对象,然后让该对象调用 add 方法,从而修改了list指向的堆上的对象。所以当你单独修改 list = xxx;时你修改的是引用,让list引用指向其它对象,而没有修改 list 引用指向的对象,因为你根本就没有访问到堆上的对象,你怎么修改它呢?
所以:要修改堆上的对象,你要先访问到它,不然你就不能修改它。访问堆上的对象的方法就是 . 点操作符。
没有访问到如何修改呢?
首先明确一下值传递和引用传递的概念:
值传递:表示方法接收的是调用者提供的值。
引用传递:表示方法接收的是调用者提供的变量地址。
· 一个方法不能修改一个基本数据类型的参数
· 一个方法可以修改一个对象参数的状态
· 一个方法不能实现让对象参数引用一个新对象
在Java中,变量分为以下两类:
①对于基本数据类型变量(int、long、double、float、byte、boolean、char),Java是传值的副本。
②对于一切对象型变量,Java都是传引用的副本。其实传引用副本的实质就是复制指向地址的指针,只不过Java不像C++中有显著的*和&符号。
需要注意的是:String类型也是对象型变量,所以它必然是传引用副本。String类是final类型的,因此不可以继承和修改这个类。
不管Java参数的类型是什么,一律传递参数的副本。
作者:JackyHwang
链接:https://www.zhihu.com/question/31203609/answer/51056048
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。