首先我們來想一個問題,在Java的函數(shù)傳參中,到底傳的是值or引用?
比如
1. public void? printMessage(int i)
外部調(diào)用? printMessage(a)
2. public void printMessage(User u)
外部調(diào)用 printMessage(user)
1.如果這個時候我在函數(shù)里改變 i的內(nèi)容,那么外面的a 肯定不會變
2.如果這個時候我在函數(shù)里改變 u的內(nèi)容,比如u.setGender("女") 那么外面的u.gender 如果是"男"? 這個時候肯定會變成女
這里不懂的、不信的你就試一下。
為什么呢?
Java中函數(shù)的形參,不管是基本變量還是對象類型變量,傳遞的都是一個拷貝。
基本變量的拷貝傳遞過去,改變不會影響原來的變量。因為變量復(fù)制一份
但是對象類型傳遞的是一份引用拷貝,引用在Java中就是指向某個指針(地址),副本引用的變化直接影響外面的對象也就不奇怪了。
再說一下C++ 里面的指針概念,指針恰恰就解決了另外的問題,拿地址來操作數(shù)據(jù)(Java只能拿引用來操作)
咱們看到的代碼?
int a ;
int *p;
p = &a ;
p是存儲指針的變量,里面的值是地址,是可變的。
但是a 是一個引用。 引用可以理解在 內(nèi)存上打的一個標(biāo)簽, 這個引用所指向的地址是不可變的。 舉個例子 a指向內(nèi)存地址為 0x01的,不可能通過編程手法變成 a指向了內(nèi)存地址為0x02的。 只可能改變a里面的值,也就是地址0x01里面的數(shù)據(jù)域
所以大概圖形是這樣子的

大伙明白了嗎?
還記得上面那句話嗎,Java只能拿著引用(a)來操作數(shù)據(jù),但是C++可以拿著地址(p) 來操作數(shù)據(jù)。
Java去掉了指針概念,簡化了程序難度,理解難度,被更多程序員所接受。
但是Java依舊保留了引用概念,也是根本去不掉的。Halal Madrid!