Java真的有引用傳遞嗎?
在Java中確實是只有值傳遞,沒有引用傳遞的,在知道什么是值傳遞什么是引用傳遞的時候我也要知道什么是值類型,什么是引用類型;
值類型在這里我就不用棧,堆,方法區這些東西來解釋, 用最樸素的方式解釋解釋。
看看下面的圖就知道什么是值類型了:
可以看到,值類型的聲明出來在內存地址中是直接開辟空間存儲值的,那么不同的變量會分配不同的內存空間。所以改變這個變量中的值對其它變量是沒有影響的。我們使用過的內容中,八大基本數據類型都是值類型,枚舉也是值類型的。
引用類型引用類型通過下面圖片示例來看看:
聲明一個對象,也就是引用類型在內存地址中存的不是值,而是指向實際對象的地址值。而它具體的對象是存在另外一個內存地址中。所以如果你把當前對象賦值給另外一個對象,它們操作的就是同一個地址的對象,所以相互之間會有影響的。
我們了解到了兩種數據的類型的工作原理,下面我們來看看什么是值傳遞什么是引用傳遞
值傳遞值傳遞的傳遞方式就是直接把聲明的內存地址中的值傳遞到方法中做運算,值傳遞對應的又可以用值數據類型做為參數,引用數據類型做參數
值類型做值傳遞
通過示例代碼我們來理解
定義方法:
public void show(int a){//方法體}
調用方法:
int a=10;
對象名.show(a);
這個時候只會把實參a變量的值10傳遞到方法中做運算
引用類型做值傳遞也是通過示例代碼來做理解
定義方法:
public void show(Student stu){//方法體}
調用方法:
Student stu=new Student();
對象名.show(stu);
引用類型會把對象的內存地址傳到方法中做運算,因為我們上面講了引用類型在內存中存的是地址值。所以引用類型做為參數傳遞到方法中做運算是會對實參stu有影響的。
引用傳遞引用傳遞在是需要在定義方法的形參中和調用方法的實參中加一些特殊符號的,所以在Java中是沒有所謂的引用傳遞的,那我就拿c#中的引用傳遞做示例來說說什么是引用傳遞。同樣的引用傳遞是用不同的數據類型做為參數。引用傳遞實際就是把變量本身傳遞到方法中做運算。
值類型做引用傳遞
也是通過示例代碼來理解,這里我用c#來做示例,值類型做引用傳遞
定義方法:
public void show(ref int a){}
調用方法:
int a=20;
對象名.show(ref a);
可以看到在c#中引用傳遞需要在形參和實參上都加上ref特殊符號,那么根據引用傳遞的概念這里實參變量a傳遞到方法中做運算會對實參有影響。
引用類型做引用傳遞其實引用類型做引用傳遞和值傳遞沒有多大的區別,因為不管怎么你是做那種傳遞方式傳進來的都是同一個地址值,也就是同一個對象。最后對實參都會有影響。
定義方法:
public void show(ref Student stu){//方法體}
調用方法:
Student stu=new Student();
對象名.show(ref stu);
總結:在Java中所謂的引用傳遞真的不存在,看到下面很多答主答的內容都是在說引用類型作為參數傳遞。總體來說數據類型總體兩大類,值類型和引用類型。傳遞方式分為兩種,值傳遞和引用傳遞。
如果有幫到您的,麻煩點個贊。如果有更好意見的小伙伴可以在評論區留言,絕對對第一時間回復,或者點個關注我們一起探討探討。