《Java编程思想》学习笔记与疑问

 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++中的引用或者指针。






你可能感兴趣的:(《Java编程思想》学习笔记与疑问)