天天看點

你真的了解形參、實參、引用類型、值類型嗎?

值類型

8大資料類型

byte、boolean、char、short、int、float、long、double

隻有以上所述類型才屬于值類型

值類型變量存儲的是記憶體位址中值的拷貝

值之間的傳遞

他們之間在傳遞時,會直接傳入值的拷貝。

如果為其中一個變量重新指派,并不會影響另一個變量的值。

例:

int c = 5;
int d = c;
c = 6;
//此時的d 還是5           

問題:為什麼不會影響?

因為 c存的是記憶體位址值的拷貝 ,重新指派時會去記憶體位址(棧)中尋找值并複制。找不到則從記憶體位址建立值并複制給變量!

引用類型

除了8大資料類型以外的其他類型都是引用類型

引用類型存儲的是指向對象的記憶體位址

引用之間的傳遞

引用類型傳遞的是對象的記憶體位址,并不是對象的拷貝,是以修改同一記憶體位址的對象内容會直接影響其他引用該對象的變量

例1:

StringBuilder a = new StringBuilder();
        StringBuilder b = a;
        a.append("1234");
        System.out.println(b);
        //1234           

引用類型僅僅隻是指向記憶體位址,當重新賦其他對象時,隻會使其指向的記憶體位址的指針發生改變,并不會影響到原來記憶體位址的對象。

例2:

String a = "sdaf";
String b = a;
a = "1234";
System.out.println(b);
//sdaf           

a的指派并沒有影響到b。因為a=“1234”的操作是重新建立對象的操作。僅僅隻是它的引用位址發生了改變。是以b所引用的對象并沒有發生任何改變自然也就等于原值了。

通過以上簡述,可以看出來,不管是值傳遞,還是引用傳遞。傳遞的其實都是變量所儲存的内容!他們實際上并沒有什麼本質上的差別

實參和形參

  • 實參(argument)就是主調方法傳入的參數。
  • 形參(parameter)就是被調方法定義時聲明的參數,作用域僅方法本身。

傳入實參必須于形參類型一緻!

這兩個參數不是同一個參數!

"當調用方法時,主調方法傳入實參,被調方法會立即給形參配置設定記憶體空間并将實參指派給形參,然後執行方法相關邏輯,并在方法結束後釋放形參記憶體資源"。

以上這段話也很好的解釋了為什麼值類型在傳遞至被調方法中,修改值并不會對原變量産生影響。正如我們上面所說的一樣,他們之間在傳遞時,會直接複制值進行傳遞。

同時也解釋了為什麼傳入引用類型時修改對象内資料會對原變量産生影響。因為傳遞的是記憶體位址

再說一點與本章内容無關的知識:值類型的值儲存的地方取決于 值類型變量聲明的地方。如果為類變量,那麼值存在堆中。類初始化時建立。如果為成員變量,那麼值存在堆中,随對象的建立而建立,為對象私有。如果為局部變量,則随方法的入棧建立在棧中,局部變量可以共享棧中的資料,随方法的出棧而銷毀。

總結

  • 1.值傳遞和引用傳遞 其實傳遞的都是其變量所存儲的内容。他們本質沒有什麼差別
  • 2.對象中有可以供你直接操作的方法或字段。操作對象的内容會直接修改所引用記憶體空間的對象内容。是以其他引用此對象的變量自然都會改變。
  • 3.值類型并沒有可以讓你操作的内部元素。你隻能通過重新指派的方式改變變量所存儲的值。改變的也隻能是重新指派的變量。
  • 4.值類型存儲的是記憶體位址的值的拷貝,引用類型存儲的是引用對象的記憶體位址。兩者重新指派都不會對其原有的值造成影響。
  • 5.方法會将傳入的實參指派給形參。形參作用于方法内。随方法的結束而銷毀。

參考

Java虛拟機—棧幀、操作數棧和局部變量表 基本資料類型的值存放在哪裡

文章包含作者個人見解,如果錯誤 敬請指正。

将喜歡的一切留在身邊,這便是努力的意義。

菅江晖