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 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 呢?费解中....
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);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
java中的String狠特别,方法内部改变不了它的引用
str="test Ok";
应改为:this.str = "test Ok";
迷茫了..
str="test ok";
ch[0]='g';
}
明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??
此问题设计Java的内存分配机制:
对于string类型:当调用change方法时,方法的参数会被当做方法的私有变量进行创建,这时内存机制是这样的,就是在栈中有两个不同的引用(全局变量str和方法内部的变量str)同时指向了堆中的一个对象,但是你在方法内部对对方法内部的私有变量进行重新赋值后,只是改变了方法内部变量的指向,对全局的str指向并没有影响。而方法结束后局部的str生命周期就会结束,而之后被垃圾回收。而你输出的是全局的str所以输出的不是“test Ok ”!不知道讲的清楚不?
在结贴页面里选择 4 楼 (千万要选对哦)
在后边Text 里填 40 分就OK 了
但是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 引用了一个新的对象 这个对象在常量池中
s = "111";你以为s变成了“abc”?错!是s重新指向了“111”,“abc”和“111”都是在常量数据里的。假如你还定义了一个String b = “111”,那么现在s和b都是指向的常量数据里的同一个地址