因为 String name = args[0];name等于传入的参数阿System.out.println(name);输出的是定义在main函数里的name

解决方案 »

  1.   

    不管你的setName方法里做了什么,你的String name = args[0];这行,就把name指定为你输入的参数了,而你的setName并没有对name做什么改变,所以输出还是你的EDF。
      

  2.   

    我增加了2个语句,程序如下:
    public class name {
      
      public static String  setName(String name){
        return name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);
        name T=new name();
        T.setName(name);
        System.out.println(name);
      }
    }
    运行javac name EDF
    结果如下:EDF
             EDF
      

  3.   

    我增加了2个语句,程序如下:
    public class name {
      
      public static String  setName(String name){
        return name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);
        name T=new name();
        T.setName(name);
        System.out.println(name);
      }
    }
    运行javac name EDF
    结果如下:EDF
             EDF
      

  4.   

    java里面任何东西都是传引用,切记。
      

  5.   

    return name = "ABC";
    这样行么?
      

  6.   

    public class name {
      
      public static String  setName(String name){
        return name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);    //这样就是ABC了,你不是希望打印出name对象的值把,幸好这里并没有建立名字为name的name对象
        //要不非晕死
        //name T=new name(); 也只是建立一个名字为T的name对象    System.out.println(setName(name));
        name=setName(name);
        System.out.println(name);
      }
    }
      

  7.   

    另一个测试
    public class name {
      //更改setName函数
      public static void setName(String name){
         name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);
      }
    }
    运行java name EDF
    答案:EDF
      

  8.   

    引用传递参数!
    你两次用set方法
    但是仅改变了对象中的name
    回到main方法后没有调用对象中的name
    当然不会出现你要的结果啦
      

  9.   

    把我原来测试的程序如下,就可以得到结果:
    public class name {
      
      public static String  setName(String name){
        return name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);
        name T=new name();
        /*T.setName(name);
        System.out.println(name);*/
       System.out.println(T.setName(name));
      }
    }
    运行java name EDF
    运行结果:EDF
             ABC
      

  10.   

    把我原来测试的程序如下,就可以得到结果:
    public class name {
      
      public static String  setName(String name){
        return name = "ABC";
      }
     
      public static void main(String [] args){
        String name = args[0];
        setName(name);
        System.out.println(name);
        name T=new name();
        /*T.setName(name);
        System.out.println(name);*/
    ==========================================
       System.out.println(T.setName(name));
    这一句并不是你说你把name变量的值改变了,而是你返回的值是ABC,也就是T.setName(name)的值,但是并没有改变MAIN方法里的变量name,这点希望你要搞清楚,这里的name和setName方法里的name没有半点关系
    下面这个程序希望对你有帮助
    public class ChangeName {
        public static void setName(String[] name){
         name[0] = "ABC";
      }
     
      public static void main(String [] args){
        String[] name =new String[1];
        name[0]= args[0];
        setName(namea);
        System.out.println(name[0]);
      }
    }
    ==========================================
      }
    }
    运行java name EDF
    运行结果:EDF
             ABC
      

  11.   

    回复人: hayar007(寂寞的猪) ( ) 信誉:100  
       System.out.println(T.setName(name));
    这一句并不是你说你把name变量的值改变了,而是你返回的值是ABC,也就是T.setName(name)的值,但是并没有改变MAIN方法里的变量name,这点希望你要搞清楚,这里的name和setName方法里的name没有半点关系
    -----------------------------------------------------
    呵呵,其实我已经搞清楚了,不过还是谢谢你。
    难道你是 febchen() 的马甲?
      

  12.   

    I think the problem point is at the statement "return name="ABC";" 
    the statement simply return a "ABC", and no operation is done on the string name. 
      

  13.   

    不怕笑话的问,CLASS 里的NAME是什么属性?知道它和main里的STRING name 没什么关系,它是CLASS的一个变量么?如果是的话,是什么变量?
      

  14.   

    setName里面的name只是个参数而已,
    并没有对main()里面的name做任何的改变也不是midlet说的那样,return name="ABC";是执行了的
    把setName改成这样看看就知道了
      public static String  setName(String name){
        name = "ABC";
        return name;
      }
      

  15.   

    public class test {
      public test() {
        demo myDemo=new demo();
        stringTest(myDemo);
        System.out.println(myDemo.testString);
        
        String strTest=new String("oldValue");
        stringTest2(strTest);
        System.out.println(strTest);
        
      }
      class demo{
        String testString=new String("oldValue");
      }
      static void stringTest(demo testDemo){
        testDemo.testString="newValue";
      }
      static void stringTest2(String str){
        str="newValue";
      }
      public static void main(String[] args){
        test testInst=new test();
      }
    }
      

  16.   

    http://www.024soft.com/blog/blogview.asp?logID=14
      

  17.   

    String类型的对象Value不可改变,一旦建立后就不可以变化!
    例如:
    String str1 = "abc";
    str1 = "bcd";
    当你执行第二条语句时,此时的str1对象已经不是原先的那个str1对象了,str1被重新分配的存贮空间!
      

  18.   

    javaeye上面有个讨论这个问题的贴子!
      

  19.   

    java中的对象参数传递按照引用,你还没搞懂这个问题,一年你都学什么了??
      

  20.   

    关键在return name = "ABC";
    先返回name=DEF,然后再赋值name="ABC"
      

  21.   

    很有迷惑性啊
    public static String  setName(String name){
        return name = "ABC";
      }
    以上name仅仅是个参数而已,在setName里定义的是参数name,跟main函数里的name完全是两回事
      

  22.   

    举个最简单的例子:
    String str1;
    声明一个String类型的str1,str1指向空(null)
    str1 = "abc";
    "abc"对应一块内存,现在的str1仅仅是指向该块内存,就是对"abc"得引用
    str1 = "cdf";
    此时的str1只是指向了另外一个块内存。
    由此可以说明一下java中 = 操作符:他只是把变量指向的内存的地址改变了
    方法调用:
    callFunction(str1){
      str1 = "another value";
    }
    在方法调用的过程其实是:
    复制了一个str1,和原来的str1指向同一块内存
    所以函数中的str1和原来的其实是不同的,只是一开始指向同一块内存
    对其使用 = 操作符,只是让复制得到的str1指向另外一块内存,而原来的str1并没有改变不知道这样说大家能不能明白?
      

  23.   

    String类是不可变的
    值传递
      

  24.   

    我认为那个方法是个静态的方法
    数组传给name的值自然就是DEF了。
      

  25.   

    恩,这个问题一直都是个问题啊,hoho
      

  26.   

    首先:程序是可以运行的,当执行java name EDF 后,结果就是EDF。
    有人说:public static String  setName(String name)这传进来的是一个引用啊,引用的值一旦改变了,那就变了呀,在C里面引用就是这个意思,所以想不通,是不是Java里面的引用和C里面的不一样啊?大家可能会这样想;
    还有人会说问题出在这条语句上面:return name = "ABC";这条语句是先返回name=“EDF”;然后name=“ABC”;
    我的看法:从入口讲起,String name = args[0];这条语句是实例化了一个String的对象name,也可以说是一个引用,相当于c里面的指针,然后让他指向内存中的一片空间,那个空间是内存分配出来存放用户输入的字符串对象的。setName(name);第二句的是调用类方法setName,传递的参数就是引用name,没有错,说白了,就是用户输入的字符串对象传递过去了,public static String  setName(String name),这个类方法为了存放这个传递过来的字符串对象,就又实例化了一个String的引用name,相当于c语言里面的行参和实参的区别,然后执行return name = "ABC";这条语句可以分为两条语句:name=“ABC”;return name;第一条语句name=“ABC”;是让setName(String name)方法里面的name这个引用指向了另外一片内存空间,而这个另外的内存空间里面存放的就是“ABC”,(这里并没有改变原来存放“EDF”的那片内存空间),return name;返回了一个字符串对象,也就是存放“ABC”的那片空间的引用;但是这个并没有影响main方法里面的那个引用name,也没有改变存放“EDF”的那片内存空间;那么当print那个引用的时候,就还是指向那个“EDF”的那个name引用。
    大家可以编译运行一下下面两个程序,看看结果:1.
    public class name {
      
      public static String  setName(String name){
    return name = "ABC";
          }
      public static void main(String [] args){
        String name = args[0];
        name = setName(name);
        System.out.println(name);
      }
    }2.
    public class name {
      
      public static String  setName(String name){
        System.out.println("2 "+name);
    name = "ABC";
    System.out.println("3 "+name);
        return name;
      }
      public static void main(String [] args){
        String name = args[0];
    System.out.println("1 "+name);
        setName(name);
        System.out.println("4 "+name);
      }
    }相信比较之后你就可以得出结论了!
      

  27.   

    还有这个程序,看看结果,你会有更惊人的发现
    public class ChangeName {
        public static void setName(String[] name){
         name[0] = "ABC";
      }
     
      public static void main(String [] args){
        String[] name =new String[1];
        name[0]= args[0];
        setName(name);
        System.out.println(name[0]);
      }
    }
      

  28.   

    return name = "ABC";我想如果你用return name;
    那肯定就是abc了吧.
      

  29.   

    哦,错了.嘿嘿.我想这两个name根本就不一样.
    System.out.println(name);中name是全局变量。而setName中只是局部变量。
      

  30.   

    哈,更本就是在胡闹嘛。这样的问题,顶多是看花了眼才会错。想想啊,JAVA是面向对象的而且是纯面向对象的,这就意味着任何单一的变量只能是某一个类的属性,你看System.out.println(name);应该是你的class name()主类的一个属性,也就是主类中的全局变量,而
    name T=new name();
    System.out.println(T.setName(name));
    也是你自己写的啊,你是用同样的名称混淆了自己,反法声明中的参数变量名,如果与全局变量重名会发生什么?是不是局部变量对全局的替代?算作覆盖吧!不过有现场保护的,System.out.println(T.setName(name));这句你输出的是方法的返回值,不是全局变量name的值,你自己把自己绕进去了:)
    君习java一年,提出这样的问题,时还没有搞清楚java编程的实质,另一方面,在一些概念上模糊不清啊!好好抓一下基础,尤其是变量作用域和生存期部分!