finemi 2015-06-10 13:31 采纳率: 100%
浏览 5551
已采纳

java中String究竟是传递的值,还是引用

很多人说,java中的String虽然是对象,但是具有值类型的特征。他是值传递,传递的值。
我认为这这种说法完全是错误的。
String和普通对象毫无区别,和其他对象一样,传递的是引用,而不是值。
一段String的运用代码:

 String a = "123";
public void change(String a){
    a = "234";
}

很多人会说,a的值没有变,是因为String是值传递,问题是,就算对于一个普通对象,这样的用法,该对象的值也是不会改变的!这是一个大大的误区。java中根本没有真正的引用传递,不想C#中有ref关键字!
比如:

 Person p = new Person("张三");
public void change(Person p){
    p = new Person("李四");
}

上面对于String的使用和这个自定义Person类的使用上,根本没有本质上的区别。同样,外面的p变量依然是”张三”,不会是“李四。”

同样的代码,放入C#中,加上ref关键字:

 Person p = new Person("张三");
public void Change(ref Person p){
    p = new Person("李四");
}

结果是,p变为了“张三”!

所以说,个人认为java中的String并没有什么特殊性,和其他类一样,同样保存的对象的引用,传递的引用。唯一的特殊性,就是可以直接用“”双引号的方式创建字符串对象。

  • 写回答

12条回答 默认 最新

  • *长铗归来* 2015-06-11 08:35
    关注

    java 传参都是传的值,这点就现在的java而言毫无疑问。
    但是java的变量在方法中一般来说有2种类型:基本类型与对象(通常这个对象是引用类型),基本类型保存在栈区,对象保存在堆区

    至于C# 的public void Change(ref Person p)或者c++的public void Change(Person& p)就语法角度来讲,确实是引用。虽然没有研究,但是觉得,这只是语法糖而已。因为无论c#或者C++的程序调用,都是基于栈机制的,所以在函数调用时,都是有明确的参数值入栈的,这时的引用参数应该是传的地址,所有的引用类型变量在编译时都由编译器改成了指针类型的操作。所以说引用是语法糖。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题