溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的值傳遞如何理解

發(fā)布時(shí)間:2022-01-17 15:42:41 來源:億速云 閱讀:121 作者:kk 欄目:大數(shù)據(jù)

Java中的值傳遞如何理解,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

一、基本概念:

值傳遞和引用傳遞是指在方法調(diào)用中,由調(diào)用者傳遞過來的參數(shù)是一個(gè)具體的值還是一個(gè)地址引用。 我發(fā)現(xiàn)小伙伴認(rèn)為Java中存在引用傳遞的最大原因就是對(duì)上邊概念中的這個(gè)“地址”有誤解,它指的是棧中變量的引用,并不是指堆中對(duì)象的地址。

  • 值傳遞:顧名思義,就是由調(diào)用方法的地方將實(shí)際的值傳到方法中。也就是說,我將我的值給你了,你想怎么改就怎么改,但是你的任何改變都不會(huì)影響我自身。

  • 引用傳遞: 引用傳遞是一種特殊的變量,它被認(rèn)為是一個(gè)變量的別名。當(dāng)定義一個(gè)引用時(shí),其實(shí)是為目標(biāo)變量起一個(gè)別名,引用并不分配獨(dú)立的內(nèi)存空間,它與目標(biāo)變量公用其內(nèi)存空間,當(dāng)定義一個(gè)引用時(shí),如果該引用不是用作函數(shù)的參數(shù)或者返回值,則必須提供該引用的初始值(即必須提供引用的目標(biāo)變量名)。

     

二、在Java中怎么只有值傳遞的?

在Java中的8大基本數(shù)據(jù)類型和String中,這個(gè)值傳遞很容易理解,看如下代碼:

public static void main(String[] args) {
   int a = 1;
   System.out.println("方法調(diào)用前:" + a);
   sum(a);
   System.out.println("方法調(diào)用后:" + a);
}

private static void sum(int a) {
   a = 2;
}
     

輸出結(jié)果為(這是意料之中的事):

方法調(diào)用前:1 

方法調(diào)用后:1

有很多小伙伴都有如下想法:Java中的對(duì)象有在堆中創(chuàng)建的,而棧中的變量只是一個(gè)地址引用,所以當(dāng)調(diào)用方法時(shí)傳遞過去的就是實(shí)際就是堆中對(duì)象的地址引用。 所以他們認(rèn)為,在Java中,對(duì)象就是引用傳遞。其實(shí)不是的,請(qǐng)仔細(xì)閱讀引用傳遞的概念,它是指傳遞過去的是這個(gè)變量的引用而不是對(duì)象的引用,也就是傳遞過去的這個(gè)實(shí)參就是棧中這個(gè)變量的引用。 但是實(shí)際是在調(diào)用方法時(shí),它傳遞的就是這個(gè)變量的一個(gè)一副本,一個(gè)復(fù)制值,但是這個(gè)復(fù)制值就是所指向的對(duì)象地址還是那個(gè),所以修改這個(gè)對(duì)象時(shí),其實(shí)修改的是堆中對(duì)象的值,所以就會(huì)改變,看如下示例:

  • Student對(duì)象(標(biāo)準(zhǔn)的JavaBean)

class Student{
   private String name;
   private int age;

   public Student(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public Student() {

   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
   }
}
     
  • 測試方法

public static void main(String[] args) {
 Student stu1 = new Student("zhangsan", 12);
 System.out.println("方法調(diào)用前:"+ stu1.toString());
   change(stu1);
   System.out.println("方法調(diào)用后:"+ stu1.toString());
}
     
  • 最主要的就是這個(gè)change()方法了,我們不好從正面去證明它是值傳遞,但是我們可以從反面去證明它不是引用傳遞:

private static void change(Student stu1) {
   stu1.setAge(22);
}
     

這個(gè)輸入結(jié)果沒有問題:

方法調(diào)用前:Student{name='zhangsan', age=12} 方法調(diào)用后:Student{name='zhangsan', age=22}

private static void change(Student stu1) {
   stu1 = new Student();
   stu1.setAge(99);
}
     

根據(jù)大家的經(jīng)驗(yàn),這個(gè)輸出肯定是:

方法調(diào)用前:Student{name='zhangsan', age=12} 

方法調(diào)用后:Student{name='zhangsan', age=12}

那么重點(diǎn)來了?為什么會(huì)是這樣,如果它是引用傳遞,那么我在這里給它new一個(gè)新對(duì)象,在main方法中的變量應(yīng)該也是一個(gè)新對(duì)象啊,因?yàn)槲腋淖兞怂囊玫刂?這足以說明這個(gè)不是一個(gè)引用傳遞,因?yàn)橐脗鬟f中,當(dāng)你改變形參的值的時(shí)候,調(diào)用方法的實(shí)參也應(yīng)該改變。

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡單性、面向?qū)ο蟆⒎植际?、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI