av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

探究java關(guān)于值傳遞還是引用傳遞的問題

值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量. 引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本, 并不是原對象本身 。 一般認(rèn)為,java內(nèi)的基礎(chǔ)類型數(shù)據(jù)傳遞都是值傳遞. java中實例對象的傳遞是引用傳遞

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、涇縣網(wǎng)站維護、網(wǎng)站推廣。

Java總是采用按值調(diào)用。方法得到的是所有參數(shù)值的一個拷貝,特別的,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。

方法參數(shù)共有兩種類型:

  • 基本數(shù)據(jù)類型
  • 對象引用

1. 基本數(shù)據(jù)類型為參數(shù)

查看一下的代碼:

public class ParamTest {
   public static void main(String[] args) {
       int price = 5;
       doubleValue(price);
       System.out.print(price);
   }

   public static void doubleValue(int x) {
       x = 2 * x;
   }
}

【輸出結(jié)果】: 5

可以看到,這個方法執(zhí)行之后,price的值并沒有變化。接下來,看一下doubleValue具體的執(zhí)行過程為:

  1. x被初始化為price值的一個拷貝,即5
  2. x乘以2后等于10。但是price沒有變化,依然是5
  3. doubleValue執(zhí)行完后,參數(shù)變量不再使用

2. 對象引用為參數(shù)

從上面的例子我們已經(jīng)知道一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)。而對象引用作為參數(shù)就不同了。看下面的例子:

class Student {

   private float score;

   public Student(float score) {
       this.score = score;
   }

   public void setScore(float score) {
       this.score = score;
   }

   public float getScore() {
       return score;
   }


}

public class ParamTest {
   public static void main(String[] args) {
       Student stu = new Student(80);
       raiseScore(stu);
       System.out.print(stu.getScore());
   }

   public static void raiseScore(Student s) {
       s.setScore(s.getScore() + 10);
   }
}

【運行結(jié)果】:

90.0

可以看出,Student實例s的內(nèi)容改變了。

具體執(zhí)行過程為:

  1. s被賦予stu值的拷貝,這里是一個對象的引用
  2. raiseScore方法應(yīng)用于這個應(yīng)用。s和stu指向同一對象,該對象的分?jǐn)?shù)增加了10
  3. raiseScore方法結(jié)束后,s不再使用,stu指向的那個對象分?jǐn)?shù)增加了10

3. 對對象是值調(diào)用還是引用傳遞?

首先編寫一個交換兩個學(xué)生的方法:

public static void swap(Student x, Student y) {
   Student temp = x;
   x = y;
   y = temp;
}

如果java對對象是采用的是引用傳遞,那個這個方法是可以的。那么x,y對象的分?jǐn)?shù)是交換的。看下面的例子:

class Student {

   private float score;

   public Student(float score) {
       this.score = score;
   }

   public void setScore(float score) {
       this.score = score;
   }

   public float getScore() {
       return score;
   }
}

public class ParamTest {
   public static void main(String[] args) {
       Student a = new Student(0);
       Student b = new Student(100);

       System.out.println("交換前:");
       System.out.println("a的分?jǐn)?shù):" + a.getScore() + "--- b的分?jǐn)?shù):" + b.getScore());

       swap(a, b);

       System.out.println("交換后:");
       System.out.println("a的分?jǐn)?shù):" + a.getScore() + "--- b的分?jǐn)?shù):" + b.getScore());
   }

   public static void swap(Student x, Student y) {
       Student temp = x;
       x = y;
       y = temp;
   }
}

【運行結(jié)果】:

交換前: a的分?jǐn)?shù):0.0— b的分?jǐn)?shù):100.0 交換后: a的分?jǐn)?shù):0.0— b的分?jǐn)?shù):100.0

可以看出,兩者并沒有實現(xiàn)交換。說明引用傳遞的說法是不正確的。接下來一步一步看看swap調(diào)用的過程:

  1. 將對象a,b的拷貝分別賦值給x,y,此時a和x指向同一對象,b和y指向同一對象
  2. swap方法體完成x,y的的交換,此時a,b并沒有變化
  3. 方法執(zhí)行完成,x和y不再使用,a依舊指向new Student(0),b指向new Student(100)

首先,創(chuàng)建兩個對象:

然后,進入方法體,將對象a,b的拷貝分別賦值給x,y:

接著,交換x,y的值:

swap執(zhí)行完成,x,y不再使用,回到創(chuàng)建時狀態(tài)。

從這個過程中可以看出,Java對對象采用的不是引用調(diào)用,實際上,對象引用進行的是值傳遞。

總結(jié)一下java中方法參數(shù)的使用情況:

  • 一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)(即數(shù)值型和布爾型)
  • 一個方法可以改變一個對象參數(shù)的狀態(tài)
  • 一個方法不能讓對象參數(shù)引用一個新的對象

本文題目:探究java關(guān)于值傳遞還是引用傳遞的問題
文章位置:http://uogjgqi.cn/article/dpcihco.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流