<span style="color: #000000;">
public class Argument{
public static void changeStr(int str){
str = 2;
} public static void changeStr(String str){
str = "name";
} public static void main(String[] args) {
int str = 1;
changeStr(str);
System.out.println(str);
String str2 = null;
changeStr(str2);
System.out.println(str2);
}
}
</span>
为啥输出是 1 和 null, str str2 却没有改变呢?如何改变它们呢?
public class Argument{
public static void changeStr(int str){
str = 2;
} public static void changeStr(String str){
str = "name";
} public static void main(String[] args) {
int str = 1;
changeStr(str);
System.out.println(str);
String str2 = null;
changeStr(str2);
System.out.println(str2);
}
}
</span>
为啥输出是 1 和 null, str str2 却没有改变呢?如何改变它们呢?
=====================
public class Argument{
public static void changeStr(int str){
str = 2;
} public static void changeStr(String str){
str = "name";
} public static void main(String[] args) {
int str = 1;
changeStr(str);
System.out.println(str);
String str2 = null;
changeStr(str2);
System.out.println(str2);
}
}
str = 2;
}
这个答案对吗?我觉得够呛
java中所有的参数都是pass by value.
可以通过数组,改变数组的元素来实现,或者提供一个新的类,把你要改变的数据作为这个类的field,通过在方法中修改对象的field来实现。
public static void changeStr(int[] str){
str[0] = 2;
}
……
int str[] = {1};
changeStr(str);
System.out.println(str[0]); 那个也类似。
相当于下边的:
int a=10;
int b=a;//这里相当于调用方法的时候,b是方式的形参,而a是调用时的实参数.
b=20;//这样,如果你改变b的值,a的值是不会改变的.也就是题目中的为什么会输出1了.
第二个String的问题是差不多的.
String str2=null;
String str=str2;//看看形参与实参
str="abc";//这里改变了形参引用的对象.但没有改变实参的值
比较下边的了:
int a[]={0,0,0};
int b[]=a;//数组对象
//情况一:
b=new int[10];//这里改变了b的引用对象,不会改变a//情况二
b[2]=10;//这样没有改变a,但改变了a[2]
方法调用的时候:我(方法)要有一个变量(形参)去接收你的这个对象,我有可以是通过这个变量去而改变你原来的值(数组情况二).有可能我用这个变量去放其它的对象了(数组情况一).我可以放你传过来的,当然也可以重新放其它对象了.
public class Argument{
public static void changeStr(int str){ //形参,这里的str只是值等于main里的那个str(也就是从main里的那个值拷贝过来的),俩个不是同一个变量
str = 2; //这里的str形参里的那个str,也不是main里的那个.那你说改变这个会改变main里的那个str么???
} public static void changeStr(String str){//同上.只不过这里的str是一个引用变量
str = "name";
} public static void main(String[] args) {
int str = 1;
changeStr(str);
System.out.println(str); String str2 = null;
changeStr(str2);
System.out.println(str2);
}
}
public class Argument{
public static int changeStr(int str){
str = 2;
return str;
} public static string changeStr(String str){
str = "name";
return str;
} public static void main(String[] args) {
int str = 1;
str = changeStr(str);
System.out.println(str);
String str2 = null;
str2 = changeStr(str2);
System.out.println(str2);
}
}
这样不就得到想要的效果了么,这样能明白些不,你前面的只不过是给另外一个变量赋值,和你当前的没有关系,输出当前的变量当然还是原来 main里定义的了
30楼:为什么既然传的是引用,那么str2不会改变了?首先传的是引用的拷贝,不是引用本身,而如果把这个拷贝指向其他对象的话,原来的引用str2也就不会改变了,那为什么会指向其他对象呢?因为str = "name"; 这句话,别小看这句话,这句话其实已经在字符串池中新建了个内容为name的字符串对象,也就是此时str引用已经指向刚刚在字符串池中新建的那个对象了。所以要理解这个问题首先要理解字符串池,好好看书把。
可以在csdn新建帖子的时候输入java值传递问题,或者字符串池问题,下面会出现以前的各类问题,方便理解。
public class Argument{
public static void changeStr(int str){ //这里的形参跟类里的成员变量同名,
str = 2; //我们知道在方法里可以调用成员变量,在方法里也可以定义局部变量,而这里好像是调用成员变量吧,定义是int str = **吧
//那就是直接调用成员变量将其赋值2吧。
}public static void changeStr(String str){
str = "name";
} public static void main(String[] args) {
int str = 1;
changeStr(str);//这里的str是实参,我知道也是直传递,可是str在等号的左边啊,那不是局部变量么??
System.out.println(str); String str2 = null;
changeStr(str2); //对于此,我跟30楼有同样的不解,,忘高手解答,谢谢
System.out.println(str2);
}
}
--------------------
楼上问的 调用成员变量将其赋值2 应该写成this.str = 2; 这也是一道面试题呀当时还做错了