今天在看题的时候,碰到一道题,挺好,分享一下。
给定以下代码,程序的运行结果是()
public class Example {
String str=new String("good");
char [] ch={'a','b','c'};
public static void main(String[] args) {
Example ex=new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str+"and");
System.out.print(ex.ch);
}
public void change(String str1,char ch1[]){
str1="test ok";
ch1[0]='g';
}
}
A. goodandabc
B. goodandgbc
C. test okandabc
D. test okandgbc
先说答案。选B。
分析一下,开始对象实例化了一个Example对象,叫ex。并有两个属性str和ch。具体分配如下 所示。
进入到change()方法后,改变如下:
所以结果为B。
字符串是不可变的,所以当str1被赋值为"test ok",就是将引用指向了新的地方,并不是改变原有的"good"。而数组呢,可以改变,将ch[0]修改为了g。
关于Java是值传递还是引用传递的问题,Java是值传递的。解释如下:
从上面的例子也可以看出,在传递参数的时候,将str(本身是一个对象的引用),复制了一份,叫str1,他也是一个对象的引用。他们指向同一个对象。如图2。
引用传递的话,那么,在传递参数的时候,是直接将str传递给了形参,只是换了一个名字叫做str1,本质上str和str1是同一个。如图4所示。
所以Java为值传递。
如有理解不正确的地方,还请留言指正,谢谢。