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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - Java中值傳遞的深度分析

Java中值傳遞的深度分析

2021-07-29 11:41昆明--菜鳥入門 Java教程

這篇文章主要給大家介紹了關(guān)于Java中值傳遞的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

首先說觀點:java只有值傳遞沒有引用傳遞

然后再來看看值傳遞與引用傳遞兩者的定義

值傳遞(pass by value)是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。

引用傳遞(pass by reference)是指在調(diào)用函數(shù)時將實際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。

這里牢記值傳遞中將實際參數(shù)復(fù)制一份

然后就是對于參數(shù)類型:值類型 和 引用類型。

結(jié)合起來理解就是:值類型傳遞,java是將其值內(nèi)容復(fù)制一份給形參;對于引用類型傳遞,java是將其地址復(fù)制一份給形參。

下面結(jié)合實例深入理解為什么java只有值傳遞

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package 字符串;
 
public class 值傳遞 {
 public static void main(string[] args)
 {
 string str1="abc";
 updatestr1(str1);
 system.out.println("main函數(shù)中"+str1);
 }
 public static void updatestr1(string str1)
 {
 str1="cba"; //<注解>
 system.out.println("調(diào)用函數(shù)中"+str1);
 }
 
}

結(jié)果:

Java中值傳遞的深度分析

在這里我們能夠清晰看到我們傳遞的是string類型的對象即(引用類型),并且在調(diào)用函數(shù)中我們修改了str1為cba,如果是引用傳遞那么我們在主函數(shù)打印則應(yīng)該是cba,

但是很遺憾我們在主函數(shù)中仍然打印出來的是abc。所以我們可以說java是值傳遞類型了嗎,答案是不完全的。

接下來再看這一段代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package 字符串;
  
 
  public class person {   private int age;   public int getage() { return age; } public void setage(int age) { this.age = age; }
 
}
public class 值傳遞2 {
 public static void main(string[] args)
 {
 person p1=new person();
 p1.setage(10);
 system.out.println("我在主函數(shù)里對p1的年齡屬性賦值為"+p1.getage());
 setage(p1);
 system.out.println("我再從主函數(shù)里獲取p1的年齡屬性"+p1.getage());
 }
 
 public static void setage(person p1)
 {
 p1.setage(18); //不是我們對它的地址進行了操作,而是我們對它地址的內(nèi)容進行了操作
 system.out.println("我在調(diào)用函數(shù)里對p1的年齡屬性重新賦值為"+p1.getage());
 }
 
}

結(jié)果:

Java中值傳遞的深度分析

咦,怎么回事這次也是傳遞的對象(引用類型),為什么這次我們對年齡這個字段的修改在主函數(shù)同步了呢?

別急,下面我們先來分析這兩個例子。

首先第一個類型的例子中,我們傳遞的是string類型的變量,它是一個特殊的類型的引用變量。

(不可變字符串:編譯器可讓字符串共享,即將各種字符串存放于公共存儲池中,字符串變量是指向其中相應(yīng)位置    --出自《java核心技術(shù) 卷1》)

出于這句話的理解就是每個字符串都對應(yīng)一個地址:我們例一中是將str1的地址復(fù)制給了我們的形參str1,并且形參中str1的地址進行了改變指向了“cba”的地址。所以說在主函數(shù)中的str1的地址仍然指向的是“abc”所對應(yīng)的地址。

所以說對于string類型的變量,我們對于給它重新賦值不是改變了它的內(nèi)容,而是改變了它指向字符串的位置。這也就解釋了為什么java中string類型是不可變類型。

而在我們例二中,我們將p1的地址復(fù)制給了我們形參中的p1,此時他們都指向的內(nèi)存中一塊相同的地址這里存放著相同內(nèi)容,所以我們在調(diào)用函數(shù)對這個地址中的內(nèi)容進行修改時就會同步到我們主函數(shù)中的p1。所以這個并不意味著這個是引用傳遞。

好吧,那怎么才能解釋好java確實是值傳遞呢(上面string類型例子是特殊的引用類型不方便解釋)

下面我們通過這個例子說明:

?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package 字符串;
public class person {
 private int age;
 public int getage() {
 return age;
 }
 public void setage(int age) {
 this.age = age;
 }
 
}
public class 值傳遞3 {
 public static void main(string[] args) {
 person p1=new person();
 person p2=new person();
 p1.setage(10);
 p2.setage(18);
 system.out.println("我在主函數(shù)里對p1的年齡屬性賦值為"+p1.getage());
 system.out.println("我在主函數(shù)里對p2的年齡屬性賦值為"+p2.getage());
 swap(p1,p2);
 system.out.println("************我是主函數(shù)里的分割線***************");
 //我再在主函數(shù)里分別對p1,p2獲取他們的年齡,若為引用傳遞則p1的年齡應(yīng)該為18,p2為10.
 system.out.println("我在主函數(shù)里獲取p1的年齡"+p1.getage());
 system.out.println("我在主函數(shù)里獲取p1的年齡"+p2.getage());
 }
 public static void swap(person p1,person p2)
 {
 system.out.println("************我是調(diào)用函數(shù)里的分割線***************");
 person temp=new person();
 temp=p1;
 p1=p2;
 p2=temp;
 system.out.println("我在調(diào)用函數(shù)里交換了p1和p2指向的地址");
 system.out.println("我在調(diào)用函數(shù)里對p1的年齡屬性賦值為"+p1.getage());
 system.out.println("我在調(diào)用函數(shù)里對p2的年齡屬性賦值為"+p2.getage());
 
 }
 
}

結(jié)果:

Java中值傳遞的深度分析

看到?jīng)],這就是充分說明java是值傳遞的例子。在這個例子中我們依然傳遞的是person類的對象p1,p2(引用類型),他們將各自的地址復(fù)制一份到了形參p1、p2。

然后我們在調(diào)用函數(shù)中交換了他們的地址,確實在調(diào)用函數(shù)中他們的age屬性發(fā)生交換。但是再當我們在主函數(shù)獲取他們的age時,如果是引用傳遞則應(yīng)該p1的age為18,p2的age為10,

和我們在調(diào)用函數(shù)中打印結(jié)果一致。但是,很遺憾在主函數(shù)中他們的值仍然是p1(10),p2(18)。所以這也充分印證了java是值傳遞。

那么什么是引用傳遞呢?我們把代碼放入c#看看。

?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
 
namespace 值傳遞or引用傳遞
{
 public class person
 {
  private int age;
  public int getage()
  {
   return age;
  }
  public void setage(int age)
  {
   this.age = age;
  }
 
 }
 class program
 {
  static void main(string[] args)
  {
   person p1 = new person();
   person p2 = new person();
   person p3 = new person();
   p1.setage(10);
   p2.setage(18);
   p3.setage(15);
   console.writeline("我在主函數(shù)里對p1的年齡屬性賦值為" + p1.getage());
   console.writeline("我在主函數(shù)里對p2的年齡屬性賦值為" + p2.getage());
   console.writeline("我在主函數(shù)里對p3的年齡屬性賦值為" + p3.getage());
   swap(ref p1,ref p2,p3);
   console.writeline("************我是主函數(shù)里的分割線***************");
   //我再在主函數(shù)里分別對p1,p2獲取他們的年齡,若為引用傳遞則p1的年齡應(yīng)該為18,p2為10.
   console.writeline("我在主函數(shù)里獲取p1的年齡" + p1.getage());
   console.writeline("我在主函數(shù)里獲取p2的年齡" + p2.getage());
   console.writeline("我在主函數(shù)里獲取p3的年齡" + p3.getage());
  }
  public static void swap(ref person p1,ref person p2, person p3)
  {
   console.writeline("************我是調(diào)用函數(shù)里的分割線***************");
   person temp = new person();
   temp = p1;
   p1 = p2;
   p2 = temp;
   p3.setage(20);
   console.writeline("我在調(diào)用函數(shù)里交換了p1和p2指向的地址");
   console.writeline("我在調(diào)用函數(shù)里對p1交換地址后年齡為" + p1.getage());
   console.writeline("我在調(diào)用函數(shù)里對p2交換地址后年齡為" + p2.getage());
   console.writeline("我在調(diào)用函數(shù)里修改p3年齡為" + p3.getage());
 
  }
 }
}

結(jié)果:

Java中值傳遞的深度分析

請注意在c#中如果我們要實現(xiàn)引用傳遞,請加上關(guān)鍵字ref,否則,它執(zhí)行的原理仍然與我們java中執(zhí)行的機制一樣,即拷貝一份地址給形參。

如果你還有點暈,不妨我們來看看下面兩張圖。

Java中值傳遞的深度分析

Java中值傳遞的深度分析

 為了方便大家理解把圖畫成這樣,然后關(guān)于java的值傳遞深度分析就到這里。歡迎大家一起討論。(可以打臉/哈哈)

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對服務(wù)器之家的支持。

原文鏈接:http://www.cnblogs.com/kunming97/p/10665287.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜福利在线观看6080 | 无码人妻丰满熟妇啪啪网不卡 | 热穴高校 | 扒开女人下面 | 人人澡 人人澡碰人人看软件 | 色中色破解版 | 国产香蕉国产精品偷在线观看 | 办公室强行丝袜秘书啪啪 | 憋尿调教绝望之岛 | 亚洲天堂精品在线 | 欧美人与禽交片在线播放 | tkvk视频| 欧美人禽杂交av片 | 欧美成黑人性猛交xxoo | 午夜亚洲视频 | 国产精品久久久久久久福利院 | 视频网站入口在线看 | 国产成人精品高清在线观看99 | 四虎1515hhcom| 国产精品久久久久久久牛牛 | 人与动人物性行为zozo共患病 | 日本国产最新一区二区三区 | 高清不卡免费一区二区三区 | 女人c交zzzooo在线观看 | 秋霞宅宅236理论片 秋霞一级黄色片 | 国产精品久久久精品视频 | 和两个男人玩3p好爽视频 | 国内亚州视频在线观看 | 欧美成人免费一区在线播放 | 成人曼画 | 美女免费观看一区二区三区 | 国产精品毛片无码 | 韩国三级年轻小的胰子完整 | 爱草视频| 全彩调教侵犯h本子全彩妖气he | 亚洲人成在线播放 | 国产精品热久久毛片 | 91香蕉小视频 | 亚洲高清在线天堂精品 | 性鸥美 | 91精品手机国产在线观 |