public class Test {
public static void main(String[] args) {
String str = new String("world");
char ch[] = {'H','e','l','l','o','w'};
change(str, ch);
System.out.println(str + "and" + new String(ch));
}

public static void change(String str,char ch[]) {
str = "Changed";
ch[0] = 'C';
}
}public static void change 这句的static为什么不能去掉?如果要改变str应该怎么做?

解决方案 »

  1.   

    2个str是不同的吗?刚才懂了现在看看又不懂了,谁帮我分析一下这个题目吧,感谢。
      

  2.   

    你这里的str不是引用传值,也就是说方法里面的参数改变不会改变原来的值。要改变的话就加个返回值
    public static String change(String str,char ch[]) {
            str = "Changed";
            ch[0] = 'C';
            return str;
        }把static去掉的话就这样写:
    public String change(String str,char ch[]) {
            str = "Changed";
            ch[0] = 'C';
            return str;
        }
    但是主函数调用的时候要:
    Test t=new Test();
    t.change(str,ch);
      

  3.   

    String 是一个常量,是不能被改变的,即使你的调用中,给str赋了别的值,那时重新创建了一个string对象并且是局部的,所以根本没有更改,原来的字符串,要想更改除非这样:
           StringBuilder sb = new StringBuilder("原来的串");      sb.clear();
          sb.append("changed");
          或者是用StringBuffer类,看来你是对常量和变量没有理解,翻一下API看看String的说明吧;
    再有就是关于static关键字,静态说明是属于某个类的方法而不是属于某个实例变量,当你要去掉这个关键字时就要先实例化一个对象才有调用这个方法。
      

  4.   

    非静态方法要通过实例对象来调用,所以要去掉static,需要通过Test t = new Test(),创建一个对象来调用
      

  5.   

    String不是基本数据类型 他是一个类,String str = new String("world");创建了2个对象,对象池中一个world,堆栈中一个str,str引用了world。
    而你后面的str = "Changed";程序又在对象池中创建了一个Changed,str引用了Changed,如果在各个程序段中输出str的值,str还是在本程序段中对对象池中字符串的引用的值,如果想改变Str的值,那就用Stringbuffer定义:Stringbuffer str=new Stringbuffer("world");
    main也是一个静态方法 静态方法内部不能直接引用外部非静态方法 要:Test test=new Test();test.changed(str);
    char ch[] = {'H','e','l','l','o','w'};实际上char类型是八大基本数据类型之一:Character类型。数组引用的是一个真实对象,ch[0]="C",改变了引用的值。
    这是我的理解。望其他人再补充下。
      

  6.   

    非静态方法要通过实例对象来调用,所以要去掉static,需要通过Test t = new Test(),创建一个对象来调用
    str是一个对象的引用,在方法调用的时候是以值的形式传递,调用完后str没有变化,但是它引用的对象发生了变化。