1. 程式人生 > >java語法知識點物件的引用和物件本身的區別,

java語法知識點物件的引用和物件本身的區別,

物件的引用和物件本身的區別:

  • 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語言傳進來了變數的地址(指標)是一個意思