String的摘引传递
String的引用传递项目中经常会用到trim这个方法,如果每个类里面用太麻烦,现在想写到一个工具类里面。下面是
String的引用传递
项目中经常会用到trim这个方法,如果每个类里面用太麻烦,现在想写到一个工具类里面。下面是代码
[解决办法]java是有引用传递的
String的底层实现是字符数组,所以string传参,还是值传递
换成String s = new String(),s仍然是String类型,还是值传递
[解决办法]我说没有引用传递,地址传递也算作值传递,如果你不同意不如举个例子证明一下,不过搜索引擎可以找到不少的反例。
[解决办法]地址传递其实就是引用传递
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。
网上随便搜了一个例子,你可以看一下
http://blog.csdn.net/sunboy_2050/article/details/6906797
[解决办法]这类用测试得出的结论有时也会背离本质,因为测试的面不够广,像我之前说的,你找到的只是反例之一。
非基本类型的确是引用,但是传递这些非基本类型时虽然传递了地址,但地址值是赋给这些参数变量的,很简单的一个问题就可以证明:你是否能通过在方法体内为传入的引用赋值来改变方法体外的这个引用?显然是不能得,因为他们根本就是2个引用引用了同一个地址,也就是将同一个值赋值给了2个变量,虽然这两个变量都是引用,但他们却是2个不同的变量,根本谈不上引用的传递。
另外,之前你说因为String底层是字符数组,所以是值传递,这个我也认为是错的。
[解决办法]上面干嘛那么执着!
方法接收的参数和传进去的变量都是指向相同的内存地址。(注:常量池,不是new的堆)
因为String是final,所有在方法里改变变量的值,只是在常量池里重新创建一个而已!
[解决办法]网上这种争论很多,其实只是概念理解上的差异
你是从严格意义上的传递的内容的角度,我是从形参值的改变是否能够影响实参的值的角度
没有继续争论的必要,多一个引用传递帮助区分这两种情况,也没有什么不好的
[解决办法]
我不明白从形参值是否能够影响实参值的角度为什么会得出不同的结论,java中形参是实参的副本,仅在方法被调用时才会分配内存单元,方法体结束,内存单元即被回收,改变形参的值是无法影响实参的值的。作为引用被传递的实际上是引用的地址,一般误区就在这里,貌似传递了地址就是地址传递,但别忘了,这建立在2个不同地址的变量的基础上,更有甚者将引用对象的属性(也就是引用的引用)的改变也拿来证明引用传递的论点(如6楼的那个链接)。