<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 却没有改变呢?如何改变它们呢?

解决方案 »

  1.   

    为啥自己写<span>不能插入代码
    =====================
    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); 

      

  2.   

    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
      

  3.   

    基本类型传的是值。那为什么这个方法 没有改变int str = 1; 的值???public static void changeStr(int str){ 
            str = 2; 
        } 
      

  4.   

    局部变量只在自己的作用域中有效,也就是说,在static方法中str=2只是在他的方法中有效,但是在方法体外面是无效的
      

  5.   

    两个方法的str变量不是同一个变量,在内存中是两个变量
      

  6.   

    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。 
    这个答案对吗?我觉得够呛
      

  7.   

    没有办法改变。
    java中所有的参数都是pass by value.
    可以通过数组,改变数组的元素来实现,或者提供一个新的类,把你要改变的数据作为这个类的field,通过在方法中修改对象的field来实现。
      

  8.   


    public static void changeStr(int[] str){ 
            str[0] = 2; 
        } 
    ……
    int str[] = {1}; 
            changeStr(str); 
            System.out.println(str[0]); 那个也类似。
      

  9.   

    首先理解两个东西,一个是实参与形参,另一个就是java的传值问题了.实参就是传给方法的变量,而形参就是方式的变量.它们是两个变量.当形参与实参都是基本变量的时候,调用方法时形参与实参的值都是一样的.
    相当于下边的:
    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]
    方法调用的时候:我(方法)要有一个变量(形参)去接收你的这个对象,我有可以是通过这个变量去而改变你原来的值(数组情况二).有可能我用这个变量去放其它的对象了(数组情况一).我可以放你传过来的,当然也可以重新放其它对象了.
      

  10.   

    java中一般数据类型是值传递,其它类型是将栈中的指针拷贝一份,因此形参和实参实际上都是指向同一对象的两个指针地址。
      

  11.   

    ding yi xia 再听听其他答案
      

  12.   

    打个比方:我有一根烟,我copy了一根给你,你把我给你的那根烟抽了,那我这根烟还在啊,还是不变啊
    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); 


      

  13.   

    其实不用讲那么复杂
    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里定义的了
      

  14.   

    难道String 传的不是地址?不是引用吗?引用不就是地址吗?既然传的 是引用那为什么str2不会改变呢?跟C中的不太一样?请高手解答一下...
      

  15.   

    这个面试题考的就是java值传递问题,这个问题是java里老问题了,反正一开始问的是比较多了,如果理解成局部变量解法也可以,2种理解方法其实归根到底都是相同的,一开始不了解java的同学理解成局部变量容易理解点,入门了后我觉得就应该理解java值传递了,对以后的学习有帮助。
    30楼:为什么既然传的是引用,那么str2不会改变了?首先传的是引用的拷贝,不是引用本身,而如果把这个拷贝指向其他对象的话,原来的引用str2也就不会改变了,那为什么会指向其他对象呢?因为str = "name"; 这句话,别小看这句话,这句话其实已经在字符串池中新建了个内容为name的字符串对象,也就是此时str引用已经指向刚刚在字符串池中新建的那个对象了。所以要理解这个问题首先要理解字符串池,好好看书把。
    可以在csdn新建帖子的时候输入java值传递问题,或者字符串池问题,下面会出现以前的各类问题,方便理解。
      

  16.   

    我还是有一点问题:
    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); 


      

  17.   

    前面的只不过是给另外一个变量赋值,和你当前的没有关系,输出当前的变量当然还是原来 main里定义的了java值传递问题,或者字符串池问题
    --------------------
    楼上问的 调用成员变量将其赋值2 应该写成this.str = 2;  这也是一道面试题呀当时还做错了
      

  18.   

    推荐看一下Core Java或者The Java  Programming Language,讲解很清楚。