一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 探討Java中函數是值傳遞還是引用傳遞問題

探討Java中函數是值傳遞還是引用傳遞問題

2020-08-04 14:59taixuyingcai Java教程

這篇文章主要介紹了探討Java中函數是值傳遞還是引用傳遞問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

相信有些同學跟我一樣,曾經對這個問題很疑惑。在網上也看了一些別人說的觀點,評論不一。有說有值傳遞和引用傳遞兩種,也有說只有值傳遞的,這里只說下個人見解

先給大家介紹下概念

值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。

引用傳遞:(形式參數類型是引用數據類型參數):也稱為傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束后被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。

先看一個例子

?
1
2
3
4
5
6
7
8
9
10
11
public class test1 {
  public static void main(string[] args) {
  int a = 10;
  changenum(a);
  system.out.println("main a=" + a);
 }
  static void changenum(int a) {
  a = 100;
  system.out.println("changenum a=" + a);
 }
}

結果:

changenum a=100
main a=10

說明對于基本的數值類型其實傳遞的是一份數值的拷貝,傳入函數之后跟原來的值就沒有關系了,在函數中改變這個數的值也不會影響到原來的值。

再看一個例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class p {
 string name = "p";
 public p(string name) {
  this.name = name;
 }
 @override
 public string tostring() {
  return name;
 }
}
 public class test {
 static p p1 = new p("p1");
 public static void main(string[] args) {
  p p = new p("p");
     system.out.println("before change p:" + p.tostring);
  changeobj(p);
  system.out.println("after change p:" + p.tostring());
 }
  static void changeobj(p p) {
  p = new p("pp");
  system.out.println("change p:" + p.tostring());
  //p = p1;
  //system.out.println(p.tostring());
 }
}

這個例子中的運行結果會是什么呢?

在這個例子中傳入的是一個對象類型的數據。

我們先來猜想一下:如果傳入的是一個對象的引用,在函數中改變了這個引用所指向的對象,那么外部的引用"p"應該是指向了新創建的p("pp")的對象才對

所以猜想的結果是:

before change p:p
change p:pp
after change p:pp

那讓我們來實際運行一下看看結果,實際的結果是:

before change p:p
change p:pp
after change p:p

想猜想的不一樣!!!

這就讓我們很疑惑了,為什么函數沒有改變引用所指向對象呢?

其實是這樣的,首先要理解“=”賦值操作的意義,

對于基本類型來說“=”賦值操作是直接改變內存地址上的值,

而對引用類型來說“=”賦值其實是改變引用變量所指向的內存地址。

探討Java中函數是值傳遞還是引用傳遞問題

賦值操作后

探討Java中函數是值傳遞還是引用傳遞問題

引用的賦值并沒有對原來的對象造成影響,"hello"對象仍然是存在的,只是str又指向了新的"world"對象

理解了賦值操作后,現在來說下函數的參數傳遞

 函數的參數實際上就是函數內部的一個局部變量,從外部傳值給這個參數實際上就是一個賦值的過程。

來看看第一個例子,傳一個定義一個int類型名稱為a的形式參數,其實完全可以把名稱改為b

然后把外部變量a的值傳遞給函數的變量,就是賦值。基本類型的賦值就是把外部a變量的10賦值給函數變量a,所以這其實是兩個變量,兩者之間沒有任何關系,

所以對函數內部變量的改變也不會對外部的變量造成影響。

再來說下引用類型的傳遞,其實是一個道理。

在傳遞的時候是把一個對象的內存地址賦值給函數內部的引用類型的局部變量

探討Java中函數是值傳遞還是引用傳遞問題

如上圖所示,兩個變量是指向同一個對象的。

在第二個例子中,我們在函數內部新創建了一個對象,并重新賦值給內部變量p,其實是改變了內部變量的引用所指向的對象,如下圖所示

探討Java中函數是值傳遞還是引用傳遞問題

所以對外部的p變量是沒有影響的。

總結:

函數參數傳遞其實是一個賦值的過程,基本類型傳遞的是數值,引用類型傳遞的引用對象的內存地址。

另外一點要特別注意,函數的參數其實是函數內部的局部變量。不要跟外部變量混淆.

以上所述是小編給大家介紹的java中函數是值傳遞還是引用傳遞問題,希望對大家有所幫助

原文鏈接:http://www.cnblogs.com/taixuyingcai/p/6373423.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜亚洲精品久久久久久 | 日本福利视频一区 | 男人最爱看的网站 | 欧美丰满大乳大屁在线观看股 | 亚洲高清在线精品一区 | 四川女人偷人真实视频 | 精品久久久久久 | 极品 女神校花 露脸91 | 国产免费大片 | 亚洲欧美一 | 被18号每天强行榨干acg | 暖暖高清日本在线 | 亚洲AV无码一区二区三区乱子伦 | 99精品国产综合久久久久 | 亚洲国产成人久久精品影视 | 欧洲第一页 | 亚洲人成网站在线观看90影院 | 久久成人伊人欧洲精品AV | 桃色视频破解版 | 国产hd老头老太婆 | 欧美高清在线精品一区二区不卡 | 日本免费精品视频 | 超碰av| 五月色综合婷婷综合俺来也 | 成人中文字幕在线高清 | 男人的天堂在线观看视频不卡 | 日本乱人伦中文在线播放 | caoporm国产精品视频免费 | 福利片福利一区二区三区 | 成人免费观看一区二区 | 日本亚欧乱色视频在线观看 | 国产99页 | a黄毛片| 亚洲欧美成人中文在线网站 | 美艳教师刘艳第三部166 | 成年女人毛片免费观看97 | 日本中文字幕不卡在线一区二区 | 性xx色3d动画xx无尽 | 欧美高清videosex极品 | 欧美综合精品一区二区三区 | 无耻之徒第十一季在线观看 |