java 中传值 传引用的问题?

zerochen 发布于 2012/12/11 14:37
阅读 362
收藏 1
public class TestValue {


public static void main(String[] args) {
String str = "man:";
StringBuffer sb = new StringBuffer("man:");

new TestValue().getString(str);
new TestValue().getString(sb);

System.out.println(str);
System.out.println(sb.toString());
}


public void getString(String str) {
str = "hello";
}

public void getString(StringBuffer str) {
str.append("hello");
}

}

结果:

man:
man:hello

传入的string 在传入 getString 并没有被改变,打印的结果仍然是 man: 但是传入的stringbuffer则可以看出改变了sb引用中对应的值,网上的解释是 String对象为final,一旦赋值则不可改变,我传入的str(String对象)其实是一个新的,并不像传入的stringbuffer的引用,但是我发现stringbuffer对象也是final对象阿,怎么解释?


加载中
1
designer
designer
方法里传递的是值类型,str.append("hello");是调用str的append方法改变其值,他的引用没变,只是值改了,
而你的String str1 = "abc";
你传递到另一个方法的执行str1 = "yyy";是将str1的指针改了,指向"yyy",
记住一点所有的方法里传的对象也好,集合也好全都是值类型,通过属性或方法改变他的值是可以,
如:${变量名}.setXXX = "ddd";
或调用别的set方法,都是在改变这个对象的值,其引用还是那一个没变。
如果你拿  ${变量名} = yyy;这肯定没戏,你是在改引用
itfanr
itfanr
非常好~~~~~~~
0
_DeepBlue
_DeepBlue

String是常量

你在法方中修改String对象 只是生产一个新的String常量

_DeepBlue
_DeepBlue
回复 @zerochen : 执行过程相当于这样:str相当于方法内的一个局部变量,先把方法声明中的str指向你传递给方法的String对象,然后,你在方法内把str指向一个新的String对象,而实际的参数String对象在方法内并没有被修改。
Not
Not
基本数据类型不会变化,对象才能成功,具体的好像得涉及到指针
zerochen
zerochen
stringbuffer 也是final阿
0
灵羽
灵羽
这个方法是给对象赋值.
public void getString(String str) {
str = "hello";
} 
这个是调用了对象的方法.
public void getString(StringBuffer str) { 
 str.append("hello"); 
 }
你在看这个方法.(和第一个方法一样这个也是赋值,和第一个是同样的结果)
public void getString(StringBuffer str) {
        str = new StringBuffer("hello");
        }
灵羽
灵羽
回复 @zerochen : System.out.println(str);你这句话打印的就是前面String str ="man:"
灵羽
灵羽
回复 @zerochen : final修饰的对象一旦创建,这个引用就不能指向其他对象。(我是这么理解的)
zerochen
zerochen
第一个方法中 str = "hello" 我认为传入的是是string在堆中的应用,假如写成str = new String("hello"); 然后传入到 getString(String str)中,在改变str的值为 hellworld,为什么结果还是原有的hello,而不是helloworld,传入的不是hello在堆中的应用吗?
灵羽
灵羽
第二个是对这个对象进行操作,而不是对其对象进行修改。
0
灵羽
灵羽
public void getString(String str) {
		str = "hello";
		System.out.println(str);
		}

public void getString(StringBuffer str) {
		str = new StringBuffer("hello");
		System.out.println(str);
		}
这样打印的str 跟你打印的str 本身就不是一个对象.
0
j&a
j&a

这位仁兄:请你记住:String 特性是什么?

只要定义是不可改变的。如果对于做了操作那么它将会产生一个新的对象。

public void getString(String str) { 
str = "hello"; 

这个str 跟他在main 方法中定义的 str 是没有一点关系的,这里的str只是一个局部变量。

你原的 str --- > 指向的还是  “man” 

http://www.haoxianggo.com

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部