读书人

这个String str为啥没变?

发布时间: 2013-01-11 11:57:35 作者: rapoo

这个String str为什么没变??
public class Example{
static String str=new String("good");
static char[] ch={'a','b','c'};
static byte a=120;
public void change(String str,char ch[]){
str="test Ok";
ch[0]='g';
}
public static void main(String[] args){
Example ex=new Example();
ex.change(str,ch);
System.out.print(Example.str+" and ");
System.out.print(Example.ch);

}

}
String传参传的是地址,为什么输出地不是test Ok 呢?费解中....
[解决办法]
static 静态变量,.............
[解决办法]
请去看String的源码。
java中的String狠特别,方法内部改变不了它的引用
[解决办法]
值传递
不是传的地址进去;
[解决办法]
你的这个赋值是给本方法的参数str赋值,并不是给全局变量str赋值
str="test Ok";
应改为:this.str = "test Ok";
[解决办法]
str="test ok"这句是改变引用的指向而已,并不是改变str之前所指向的对象的值。

str是一个局部变量,它的指向改变了影响不到ex.str的值,str还是指向new String("good"),这个画个图很容易理解。
[解决办法]
值传递与引用传递,基本数据类型,静态变量
[解决办法]

引用:
值传递
不是传的地址进去;

String应该是引用类型吧...
迷茫了..
[解决办法]
java 方法参数传递不是地址传递,是值传递。
[解决办法]
5楼正解。
[解决办法]
引用:
引用:
值传递
不是传的地址进去;

String应该是引用类型吧...
迷茫了..

引用也只是传的引用的值即(引用所指的地址)
你可以通过这个地址去改变这个地址空间中的属性值
但你无法让原引用的指向改变
[解决办法]
change方法里面的str不是类的字段str~而是传进来的参数str,如果你加个this.就可以了
引用:
不好意思应该是这个
public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch……

[解决办法]
很明显,在此处String传进去的是Str的一个副本,穿进去的是值。儿Char数组ch本身存放的就是char数组的首地址,所以传进去的是ch的首地址,必然会导致String结果不变,而Char数组的值发生改变。
[解决办法]
引用:
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??


这是一个错误的认识,就算你把属性名改成和参数名不同结果还是一样的。
[解决办法]
引用:
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }


明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??


不是同名的问题,如果你非要用方法参数对象改变传入数据的局部变量或全局变量在java中是行不通的,java方法参数传递的是对象的值,不是地址,这个是个特殊的地方。
[解决办法]
很常见的问题,我来解释:
此问题设计Java的内存分配机制:
对于string类型:当调用change方法时,方法的参数会被当做方法的私有变量进行创建,这时内存机制是这样的,就是在栈中有两个不同的引用(全局变量str和方法内部的变量str)同时指向了堆中的一个对象,但是你在方法内部对对方法内部的私有变量进行重新赋值后,只是改变了方法内部变量的指向,对全局的str指向并没有影响。而方法结束后局部的str生命周期就会结束,而之后被垃圾回收。而你输出的是全局的str所以输出的不是“test Ok ”!不知道讲的清楚不?
[解决办法]

[解决办法]
Java中参数传递的确用的是地址传递;
但是String比较特殊,一旦赋值内存里面的内容就不能改变了,
而且String是引用类型的;重新赋值后它指向的地址就改变了,
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
}
ex.change(ex.str,ex.ch);
调用这个方法时,会将ex.str和ex.ch在内存中的地址传递给Str和ch[];他们本身指向的地址没变
执行 str="test ok"; 时,change中str指向的地址改变了,但ex.str指向的地址没变;
所以ex.str的值还是String str=new String("good");
ch[0]='g';会将ch[0]指向的地址的值改变,所以最终ex.change(ex.str,ex.ch);
改变了ch[]的值,但str的值仍然不变
[解决办法]

String str = "test OK";创建一个对象,常量池中
String str = new String("test OK");创建两个对象 常量池,堆

当把引用传进方法中 这句:String str = "test OK";
String 引用了一个新的对象 这个对象在常量池中

读书人网 >J2SE开发

热点推荐