<span style="font-size:14px;">回顾下什么是指针、引用的初始化
int a = 0;
int *p = &a;//指针
int &b = a;//引用(别名)</span>
了解了指针和引用,看下面这个例子:
<span style="font-size:14px;">/**
* @author andaren
* @date 2016-1-21
*/
public class Test {
public static void main(String args[]) {
TT ta = new TT();
System.out.println("ta:" + ta);//ta:TT@5d888759
TT tb = ta;
System.out.println(ta == tb);//true
change(ta);
System.out.println("ta:" + ta);//ta:TT@5d888759
}
public static void change(TT a) {
a = new TT(1);
System.out.println("a:" + a);//a:TT@2e6e1408
}
}
class TT {
int tInt = 0;
TT(){}
TT(int tInt){
this.tInt = tInt;
}
}</span>
传进change方法中的参数TT a 是什么呢?
在C++中有三种传递参数的方法:值传递、指针传递、引用传递;而对于对象的传递,传递的都是对象内存单元的首地址:指针变量传递指针变量指向对象的内存地址,引用变量传递同名对象的内存地址;
如果是指针传递,那么,传递的就是ta内存地址的拷贝,改变a的内容不会改变ta的值。
虽然指针传递不会改变原来的值,但是按照传递过来的地址,还是可以改变该地址对应的对象的相关成员。
如果是引用传递,那么,传递的就是ta对象内存地址,而不是拷贝。该地址也应该是不可改变的。(C++中别名的唯一绑定)
但是从例子中,我们看到:给a重新分配一个内存空间后,ta的值,并没有改变,这只能说明,我们最好以指针传值的方式理解Java中的“引用传值”。由于指针是可变的,所以当分配了一个新的对象后,指针指向就变了。而我们知道,所有的指针传递的实质都是值传递(地址值传递),所以观点就这么出来了。(虽然有点牵强)
<span style="font-size:14px;">a:TT@2e6e1408当然,这个</span><span style="font-size:14px;"></span><pre name="code" class="java"><span style="font-size:14px;">2e6e1408不一定就是地址值,但至少表示了同一个对象(强行同一个)。</span>
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
希望以后研究了汇编那一块儿,对这里有新的认识,那时再补充!
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
补充一个梨子
/**
* @author andaren
* @date 2016-1-21
*/
public class Test {
public static void main(String args[]) {
TT a = new TT();
System.out.println("第一次初始化之后a:" + a);
change(a);
System.out.println("置换调用之后a:" + a);
}
public static void change(TT a) {
TT b = new TT(1);
a = b;
System.out.println("置换方法内部a:" + a);//a:TT@2e6e1408
}
}
class TT {
int tInt = 0;
TT(){}
TT(int tInt){
this.tInt = tInt;
}
}
//****************************//
第一次初始化之后a:TT@6af62373
置换方法内部a:TT@459189e1
置换调用之后a:TT@6af62373
如果是引用传递(一开始存a的地址的变量作为形参),那么a = b 之后,a所指向的对象应该变了。但是没变。
如果是指针传递(一开始存a的地址的变量的复制品作为形参),那么 a = b 之后,的确是a不变。所以我觉得,Java里的引用传递,更像是c中的指针传递。