激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99re3| 欧美在线国产 | 91精品久久久久久久久久久 | 青久草视频 | 99在线在线视频免费视频观看 | 久久我不卡 | 国产乱淫av| 成人三区四区 | 国产亚洲精品久久久久久网站 | 久久成人国产精品入口 | 美女黄视频在线观看 | 日本aaa一级片 | 欧美激情在线播放 | 最新一区二区三区 | 一区二区三区国产好的精 | 成年人小视频在线观看 | 羞羞视频免费观看入口 | 亚洲极色 | 国产一区精品视频 | 特级毛片免费 | 久草视频2 | 黄色免费高清网站 | 中文在线观看免费视频 | 日日草夜夜 | 中文字幕h | 99精品视频久久精品视频 | 牛牛a级毛片在线播放 | 4480午夜| 艹艹艹逼 | 亚洲精品久久久久久久久久 | 免费看综艺策驰影院 | 日本aaaa片毛片免费观看视频 | 黄色片在线播放 | 国产精品久久久久久久久久东京 | 欧美一级视屏 | 久久人人爽人人爽人人片av免费 | 国产午夜精品理论片a级探花 | 日本aaaa片毛片免费观蜜桃 | 激情综合婷婷久久 | 久久久久久久免费看 | 色av成人天堂桃色av |