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

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 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动