java語法知識點物件的引用和物件本身的區別,
阿新 • • 發佈:2018-11-25
物件的引用和物件本身的區別:
- java中沒有指標的概念,取而代之的是引用(這個和c++中的引用不是一個意思),這個引用是一個變數而已,存放在棧裡面(你可以理解棧和堆是計算機儲存器中的不同位置,但是都是用類儲存資料的),變數內容是它所指向的那個物件(存放在堆裡)的起始地址
- 舉個例:Boy b = new Boy();
- Boy是一個class,類只是一個物件構造方式的描述,需要new Boy()後,此時就根據這個類描述的構造規則實實在在構造出來了一個物件(物件是一個實體,會在儲存器中實實在在佔用一塊記憶體(就像一個數組一樣),裡面包括了所定義的變數,函式等等),那麼這一塊記憶體有一個有個起始地址對吧,這個起始地址就賦值給了b這個變數,很明顯b的內容就是一個地址而已,假如你的計算機是64位的,那麼我們可以認為這個b變數就是64位的int型變數而已,給這個變數b取個名字,就叫做物件的引用
- 上面的解釋可能有些地方不是很嚴謹,但是原理完全是正確的,對於理解這個內容足夠了
java中函式的形參會不會改變實參的內容:
- 這裡我舉個例
- void func(int a)
- { a=3; }
- int c=1;
- func(c); // 執行完後,此時c變數的值還是1,為什麼呢,因為函式都是用值傳遞的方式
- 記住c是基本型別資料(int,char,long,float等),所以呀,我們分析一波,發現這跟c語言一樣嘛,肯定是交換不了的
-
那怎麼才能改變基本資料型別的實參的值呢,通過陣列方式:
-
int c = 1;
-
int
[] arr={c};
-
void func(int
[] arr)
-
{ arr[0] = 3;}
-
func(arr); // 執行完後,c=3,因為是按照陣列方式,實際上是傳進來了陣列的地址,那麼函式裡面相當於是對這個地址所指向的空間進行賦值,這不就是指標的原理嗎,所以就能實現改變實參的值
- void func(Boy a)
- { a.age = 3; }
- Boy c=new Boy(5);
- func(c);
- // 執行完後,引用c所指向的物件的內容已經變了,因為函式裡面是對傳進來的那個地址的內容做了改變,所以當然會影響形參所指向那個物件了,這裡其實就跟c語言傳進來了變數的地址(指標)是一個意思