public class Test
{
public static void main(String[] args)
{
String str = new String("World");
char ch[] = {'H','e','l','l','o'};
change(str,ch);
System.out.print(str+"and");
System.out.println(ch);
}
public static void change(String str,char ch[])
{
str = "Change";
ch[0] = 'C';
}
}
不是说java全都是值传递的 然后传递的都是副本么 那么按说程序结果因该是
world and hello阿
怎么变成了
woeld and cello了
请牛人解答
{
public static void main(String[] args)
{
String str = new String("World");
char ch[] = {'H','e','l','l','o'};
change(str,ch);
System.out.print(str+"and");
System.out.println(ch);
}
public static void change(String str,char ch[])
{
str = "Change";
ch[0] = 'C';
}
}
不是说java全都是值传递的 然后传递的都是副本么 那么按说程序结果因该是
world and hello阿
怎么变成了
woeld and cello了
请牛人解答
只是str = "Change"让str形参引用指向了"Change"
而不是让main中的str指向Change(这里可以将str形参看成C++的指针,
在change()中改变的是str的指向,而不是改变其值,事实上任何改变
字符串的操作jvm都会创造一个新的字符串,而不是真的在原串上修改)
str = "Change";语句首先是到内存中查找是否存在"Change"字符串
没有就str = new String("Change");这样就改变了str的指向,它不
在引用main()传来的str实参
首先C中数组必须再编译时确定大小
而java可以动态分配,还有c\c++不允许返回数组
java可以,这说明java的数组也是引用类型的java传值是错误的,这也不能这么说
java可以用内部类的某些机制实现c\c++的一些功能
只是更安全,当然,我们还是承认,不能传地址确实
有时候不方便
如果是传递一个超长字符串
jvm会去拷贝不啊?
不过ch[0]='C',你改变了原来的数组内容,所以影响到main里的ch,如果变成这样
ch = new char[]{'c','e','l','l','o'};ch就指向了{'c','e','l','l','o'};,不会改变原来的数组
这个里面还涉及到对象不可变的问题
Sting就是个不可变的
这种问题多看看书 就知道了 还跑这来问啥
System.out.println(ch);这句的意思是把ch所指向的对象的值输出到控制台,不是把ch的值输出到控制台