P27 :
这次用Java做期末大作业时,遇到了一个关于使用Java引用的错误:
关于Java函数参数的传递引用与C++传参引用的区别:
Java中,除了Primitive基本类型外,其他所有类型所传递的都是引用。
但是这里的“引用”与C++有区别,而且容易混淆。
看两个例子:
(一)
class Test{
static void func(String x){
x = "haha";
}
public static void main(String[] args){
String str = "aaa";
func(str);
System.out.println(str); // 输出什么?
}
}
(二)
class Node{
int x;
}
class Test{
static void func(Node n){
n.x = 4;
}
public static void main(String[] args){
Node a = new Node();
a.x = 10;
func(a);
System.out.println(a.x); // 输出什么?
}
}
答案:
(一) 输出: aaa
(二) 输出:4
为什么同样是引用传递,第一个的值没有改变,而第二个就改变了呢?
第一个程序输出了aaa,但是按照C++的经验,既然传参的是引用,那么这里应该是输出"haha"才对的,为什么还是输出"aaa" ?
原因在于,x是一个引用变量,通过调用func函数,传递str进去,这时func中的x和str指向了堆中的同一个对象。
然后是一个赋值语句 x = "haha", 这是关键,此时它并不是把x指向的对象变为"haha", 而是让x引用指向了另一个对象"aaa"!
而str这个引用还是指向原来那个"aaa"对象,所以当然还是输出"aaa"。在这里理解为指针或许更容易理解。
而第二个程序,并没有把函数中的引用指向另一个,而是操作了str指向的对象的数据,改变了它的值。所以输出了改变后的值。
由此看来,Java的引用不能简简单单的就认为它是C++中的引用或者指针。