String是引用传参吗?

瑾安 2011-08-18 03:37:44


public class testClass {
public static void main(String[] args)
{
String s="ABC";
// testClass test = new testClass();
// test.function(s);

System.out.println(s);
}
static void function(String s)
{
s="D";
// return s;
}

}

为什么这个的输出还是ABC?
...全文
210 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
春文秋武 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangxf_8341 的回复:]

String 是类,所以是引用传递,方法里面的参数只是个副本,String类是个final类,在这里你可以把他当基本类型一样使唤
[/Quote]

支持
qybao 2011-08-18
  • 打赏
  • 举报
回复
如果引用传递是指地址传递,那么是引用传递的,否则java里没有引用传递,都是值传递,基本类型的变量,内存中保存的是变量的文面上的值,引用类型保存的是对象的地址,内存中保存的信息统称为变量的值。
这个问题已经讨论很多次了,LZ要知道每个方法有自己的方法栈,方法中的变量在各自的方法栈的数据区,虽然名字一样,但是内存地址不一样。
public class testClass {
public static void main(String[] args)
{
String s="ABC"; //要知道这里是s和function的s是两个方法中的变量,两个方法是不同的方法栈,所以这里的s和function方法的s是不同的两个变量
// testClass test = new testClass();
// test.function(s); //参数传递的时候,只是把这里的s的值(对象的地址)复制给function方法中的s,所以两个s的值一样,即两个s都指向同一个"ABC"对象

System.out.println(s);
}
static void function(String s)
{
s="D"; //这里改变了function方法的s,让它指向另一个对象"D",但是上面说了,这里的s和上面的s是两个方法栈的变量,是不同的,所以这个的改变不影响方法外的s的指向
// return s;
}

}
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bearkin 的回复:]
.....String是引用传参 但是String是final类 而且没有对外提供修改String对象属性的函数 所以总有人认为是值传递 我用个简单的方式证明下吧..


Java code

import java.lang.reflect.Field;

public class TestString {
public static void main(String[]……
[/Quote]正解!!!你的话我听懂了,可能楼上的说的不是很通俗,所以我不能理解,不过终于找到个能理解的那就给你分了
BearKin 2011-08-18
  • 打赏
  • 举报
回复
.....String是引用传参 但是String是final类 而且没有对外提供修改String对象属性的函数 所以总有人认为是值传递 我用个简单的方式证明下吧..


import java.lang.reflect.Field;

public class TestString {
public static void main(String[] args) throws Exception {
String str = "abc";
changeString(str);
System.err.println(str);
}

public static void changeString(String str) throws Exception {
Field field = str.getClass().getDeclaredField("value");
field.setAccessible(true);
char[] c = {
'a', 'b', 'd'
};
field.set(str, c);
}
}
gsy999 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xiarenwang 的回复:]
引用 21 楼 gsy999 的回复:
引用 19 楼 xiarenwang 的回复:
或者说其实s=“D”其实就相当与s=new String(“D”)?

static void function(String s)
{
s="D";
// return s;
}
什么意思?这能说这里的s改变了外面的s? 这应该是本地的s指向了新的对象.
理论上的概念大家都懂了,
你再换……
[/Quote]
我懂,通过对象的方法修改对象的属性应该具有相对"持久性"
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiarenwang 的回复:]
引用 16 楼 wangxf_8341 的回复:
String 是类,所以是引用传递,方法里面的参数只是个副本,String类是个final类,在这里你可以把他当基本类型一样使唤
这句话好像是重点,是不是就是因为String是个final类,所以才不能向StringBuffer和其他类一样直接传递指向地址的指针,而是复制一个副本指针呢?
[/Quote]自我纠正下,final只是让String这个类不能被继承而已,跟这个好像没关系。。。
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 gsy999 的回复:]
引用 19 楼 xiarenwang 的回复:
或者说其实s=“D”其实就相当与s=new String(“D”)?

static void function(String s)
{
s="D";
// return s;
}
什么意思?这能说这里的s改变了外面的s? 这应该是本地的s指向了新的对象.
理论上的概念大家都懂了,
你再换个方法试试.
[/Quote]以上面的StringBuffer来说,他的方法就能改变mian函数里的StringBuffer对象的值啊
gsy999 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xiarenwang 的回复:]
或者说其实s=“D”其实就相当与s=new String(“D”)?
[/Quote]
static void function(String s)
{
s="D";
// return s;
}
什么意思?这能说这里的s改变了外面的s? 这应该是本地的s指向了新的对象.
理论上的概念大家都懂了,
你再换个方法试试.
caishaolang 2011-08-18
  • 打赏
  • 举报
回复
相当于创建了一个新的String 地址不同 值相同
瑾安 2011-08-18
  • 打赏
  • 举报
回复
或者说其实s=“D”其实就相当与s=new String(“D”)?
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangxf_8341 的回复:]
String 是类,所以是引用传递,方法里面的参数只是个副本,String类是个final类,在这里你可以把他当基本类型一样使唤
[/Quote]这句话好像是重点,是不是就是因为String是个final类,所以才不能向StringBuffer和其他类一样直接传递指向地址的指针,而是复制一个副本指针呢?
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gsy999 的回复:]
引用 8 楼 xiarenwang 的回复:
求给个说法~~

Java 的类参数都是引用传参.

s (函数外面的s)
---------
函数里面还有一个
s (复制品)
两个s都是对象的引用
当退出函数后,下面的这个s就不存在了.
[/Quote]
//这样的帖子以前好几次了
public class Foo {

public static void main(String sgf[]) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(
a,
b);
System.out.println(a + "," + b);
}

static void operate(StringBuffer x, StringBuffer y) {//这里会拷贝引用a和b,拷贝成x和y,
x.append(y);//这时候x和a指向同一个对象,所以改变了x,也影响到了引用a!所以它为AB
y = x;//但是这里,仅仅把引用Y指向了引用x,也就是a,x,y指向同一个对象,但是原先的引用b还是指向原来的对象!!
}
}
那以这个为例,StringBuffer肯定是引用传递了,但是他会改变原来的值啊
淡定的峰哥 2011-08-18
  • 打赏
  • 举报
回复
String 是类,所以是引用传递,方法里面的参数只是个副本,String类是个final类,在这里你可以把他当基本类型一样使唤
waynell 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiarenwang 的回复:]

引用传递的话我在下面的方法里修改了他的值那原来的值应该会变吧,我就在这个地方费解了
[/Quote]
注意引用传递和指针的区别。

public static void main(String[] args)
{
String s="ABC";
// testClass test = new testClass();
//无论方法内怎么处理s的引用是不能被修改的,但是可以修改引用的内容。
// test.function(s);

System.out.println(s);
}
static void function(String s)
{
s="D";
// return s;
}
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jingluo 的回复:]
static void function(String s)
{
s="D";
}

进入方法是,s的指针复制了一份,进入后,局部指向到“D”所在内存空间,退出方法后,s还是指向原来的那个——而副本指针做为局部变量已经回收了
[/Quote]那String不就是相当于值传递了?,只不过值传递复制的是值,而Stirng复制的是指针?
gsy999 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiarenwang 的回复:]
求给个说法~~
[/Quote]
Java 的类参数都是引用传参.

s (函数外面的s)
---------
函数里面还有一个
s (复制品)
两个s都是对象的引用
当退出函数后,下面的这个s就不存在了.

jingluo 2011-08-18
  • 打赏
  • 举报
回复
static void function(String s)
{
s="D";
}

进入方法是,s的指针复制了一份,进入后,局部指向到“D”所在内存空间,退出方法后,s还是指向原来的那个——而副本指针做为局部变量已经回收了
瑾安 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gsy999 的回复:]
不输出"ABC"输出什么? LZ问的好奇怪.
[/Quote]现在的问题是String是引用传递还是值传递,如果是引用传递的话传递的是对象的指针,那我改变了指针指向的对象那原来的就应该改变的,如果是值传递的话,那这个ABC就说得通,但是String他不属于基础类型,应该是引用传递的,但是结果怎么还是ABC,这样说你应该听懂了吧,求解答~~
softroad 2011-08-18
  • 打赏
  • 举报
回复
基本类型都是值传递。
gsy999 2011-08-18
  • 打赏
  • 举报
回复
不输出"ABC"输出什么? LZ问的好奇怪.
加载更多回复(8)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧