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

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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵