真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中的值傳遞如何理解

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

成都創(chuàng)新互聯(lián)公司10多年成都企業(yè)網(wǎng)站定制服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),成都企業(yè)網(wǎng)站定制及推廣,對(duì)成都房屋鑒定等多個(gè)方面擁有豐富建站經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。

一、基本概念:

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

  • 值傳遞:顧名思義,就是由調(diào)用方法的地方將實(shí)際的值傳到方法中。也就是說(shuō),我將我的值給你了,你想怎么改就怎么改,但是你的任何改變都不會(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ù)類(lèi)型和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í)傳遞過(guò)去的就是實(shí)際就是堆中對(duì)象的地址引用。 所以他們認(rèn)為,在Java中,對(duì)象就是引用傳遞。其實(shí)不是的,請(qǐng)仔細(xì)閱讀引用傳遞的概念,它是指?jìng)鬟f過(guò)去的是這個(gè)變量的引用而不是對(duì)象的引用,也就是傳遞過(guò)去的這個(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 +
               '}';
   }
}
     
  • 測(cè)試方法

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é)果沒(méi)有問(wèn)題:

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

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

Java的特點(diǎn)有哪些 1.Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以?xún)?yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡(jiǎn)單性、面向?qū)ο蟆⒎植际?、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫(xiě)桌面應(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


名稱(chēng)欄目:Java中的值傳遞如何理解
文章網(wǎng)址:http://weahome.cn/article/ghsoeh.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部