java关于String作为形参的问题。

String类按道理说应该是引用类型是吧?比如有Strings1="Hello!";然后有个方法publicvoidchange(Strings1){s1+="world... String类按道理说应该是引用类型是吧?
比如有
String s1="Hello! ";
然后有个方法
public void change(String s1){
s1+=" world!";
}
然后我再
change(s1);
System.out.println("s1");
但是结果还是 Hello!
何解?
展开
 我来答
寒舍_
2013-04-29
知道答主
回答量:3
采纳率:0%
帮助的人:4.1万
展开全部
String参数传递问题的症结所在
其实,要想真正理解一个类或者一个API/框架的最直接的方法就是看源码。
下面我们来看看new出String对象的那小段代码(String类中),也就是String类的构造函数:

public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}

也 许你注意到了里面的char[],这说明对String的存储实际上通过char[]来实现的。怎么样?其实就是一层窗户纸。不知道大家还记不记得在 Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其 对应的基本类型操作而实现的。是不是有所感悟了?对,String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对 应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样 的,Integer、Float等这些包装类和String在这种情况下的表现是相同的,具体的分析在这里就省略了,有兴趣的朋友可以自己做做试验。
简单地说:String就相当于是char[]的包装类,而包装类的特质之一就是在对其值进行操作时会体现出其对 应的基本类型的性质,而char作形参的话是不会改变实参的。引用别人的,希望可以帮到你。http://xueliang1yi.blog.163.com/blog/static/11455701620121140330271/
马啃菠萝1
2012-07-16
知道答主
回答量:44
采纳率:0%
帮助的人:20万
展开全部
形参永远不改变实参。
如果传的是容器如Map、List等,容器本身的指向是不能改变的,但可以改变容器内的内容
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
baoer1127
2012-07-16 · TA获得超过926个赞
知道小有建树答主
回答量:939
采纳率:71%
帮助的人:337万
展开全部
把你完整的代码写出来
你的这个change方法是成员方法。你的这个s1 也是成员属性。

Java中的参数是就近原则。
在你那个方法中。s1+=“world!”
就是你的形参啊。 你要是想加到hello 后面
就是用 this.s1 +="World!"
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
poppk
2012-07-16
知道答主
回答量:24
采纳率:0%
帮助的人:13.3万
展开全部
s1="hello"的s1和方法参数的s1又不是表示一个变量。。。
名字叫一样的而已 作用域根本不一样
你的代码改变的是方法内部的那个s1的引用地址,影响不到外面的s1的。。。
你把代码改成
public void change(String s2){
s2+=" world!";

}
就容易理解了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
archyly
2012-07-16 · TA获得超过1318个赞
知道小有建树答主
回答量:389
采纳率:50%
帮助的人:429万
展开全部
public void change(String s1){
s1+=" world!";
}
你这根本没有返回数据。
String s1="Hello! ";//你这是全局变量。

s1+=" world!"; //你这是方法内的变量。
要实现你要的效果要这样写
this.s1 +=" world!";
追问
不是这个问题。s1是在main函数里面的局部变量。仅供测试用。不存在什么this指针。
我想知道的问题是。。。
我不想重复了。麻烦您再看一遍
追答
两个s1引用的地址是不一样的。所以你使用change方法改变的其实并不是你开始定义的s1,明白了吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式