今天早上我了一道有关java的题。主要考点是考java中值得传递方式。
之前我在javaoo里总结的是:基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址,那么基本数据类型就是按值传递,引用数据类型就是按地址来传递的。(难道我一开始就错了)
题是真样的:
1 public class SendValue{ 2 public String str="6"; 3 public static void main(String[] args) { 4 SendValue sv=new SendValue(); 5 sv.change(sv.str); 6 System.out.println(sv.str); 7 } 8 public void change(String str) { 9 str="10"; 10 } 11 }
输出的结果是:?6
有解释说:change方法里面是将传入的参数修改成10,但是并没有对SendValue的属性str就行修改,要修改必须指明this.str="10",所有答案还是6。
还有一题是这样的:
1 public class Example{ 2 String str=new String("hello"); 3 char[]ch={'a','b'}; 4 public static void main(String args[]){ 5 Example ex=new Example(); 6 ex.change(ex.str,ex.ch); 7 System.out.print(ex.str+" and "); 8 System.out.print(ex.ch); 9 } 10 public void change(String str,char ch[]){ 11 str="test ok"; 12 ch[0]='c'; 13 } 14 }
输出的答案是 : ? hello and cb;
有的解释说:String类是final类型的,不能继承和修改这个类。str=“tesk ok”,其实是隐含的让Java生成一个新的String对象,那么就与原来的“Hello”没有任何关系,当函数结束,str作用结束,所以输出的还是“Hello”。 char ch[] 是传递引用,修改了原内容。
然后我上网查,java 是按值传递还是引用传递,有的说:
http://blog.csdn.net/zzp_403184692/article/details/8184751
按值传递:指的是在方法调用时,传递的参数是按值的拷贝传递。就是说传递的是拷贝后的值,与前面那个值无关了。
引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递前后都是同一个引用。
但是又有人说这是不对的,他说Java中只有按值传递,没有按引用传递!
http://guhanjie.iteye.com/blog/1683637
各位大神们,给我解释解释嘛!