日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」?

發(fā)布時(shí)間:2023/12/2 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于Java傳參時(shí)是引用傳遞還是值傳遞,一直是一個(gè)討論比較多的話題。

有人說Java中只有值傳遞,也有人說值傳遞和引用傳遞都是存在的,比較容易讓人產(chǎn)生疑問。

關(guān)于值傳遞和引用傳遞其實(shí)需要分情況看待。

一、Java數(shù)據(jù)類型

我們都知道,Java數(shù)據(jù)類型分為「基本數(shù)據(jù)類型」和「引用類型」兩大類。

基本數(shù)據(jù)類型(8種)

引用類型(3種)

引用類型可分為類引用類型(類)、接口引用類型(接口)和數(shù)組引用類型(數(shù)組)。以下代碼定義了3個(gè)引用變量:user、myThread、intArray:

User user;

java.lang.Runnable myThread;int[] intArray;

其中user變量位類引用類型,myThread變量為接口引用類型,而intArray變量為數(shù)組引用類型。myThread變量之所以是接口引用類型,是因?yàn)閖ava.lang.Runnable是接口,而不是類。

類引用類型的變量引用這個(gè)類或者其子類的實(shí)例,接口引用類型的變量引用實(shí)現(xiàn)了這個(gè)接口的類的實(shí)例,數(shù)組引用類型的變量引用引用這個(gè)數(shù)組類型的實(shí)例。在Java語言中,數(shù)組也被看作對(duì)象。由此可見,不管是何種引用類型的變量,他們引用的都是對(duì)象。

如果一個(gè)引用類型變量不引用任何對(duì)象,那么可以把它賦值為null。在初始化一個(gè)引用類型變量時(shí),常常給它賦初值為null。

User user = null;

方法的參數(shù)分為實(shí)際參數(shù)和形式參數(shù)。

實(shí)際參數(shù):調(diào)用方法時(shí)寫的具體數(shù)值。

形式參數(shù):定義方法時(shí)寫的參數(shù)。

一般情況下,在數(shù)據(jù)做為參數(shù)傳遞的時(shí)候,基本數(shù)據(jù)類型是值傳遞,引用數(shù)據(jù)類型是引用傳遞(地址傳遞)。

值傳遞

public static voidmain(String[] args) {int num1 = 100;int num2 = 200;

take(num1, num2);

System.out.println("num1 = " +num1);

System.out.println("num2 = " +num2);

}public static void take(int a, intb) {int temp =a;

a=b;

b=temp;

System.out.println("a = " +a);

System.out.println("b = " +b);

}

運(yùn)行結(jié)果:

a = 200b= 100num1= 100num2= 200

流程

主函數(shù)進(jìn)棧,num1、num2初始化。

調(diào)用take方法,take()進(jìn)棧,將num1和num2的值復(fù)制一份給a和b。

take方法中對(duì)a和b的值進(jìn)行交換。

take方法運(yùn)行完畢,a、b的值已經(jīng)交換。

take方法彈棧。

主函數(shù)彈棧。

解析

在take方法中,a、b的值進(jìn)行交換,并不會(huì)影響到num1和num2。因?yàn)閍、b中的值只是從num1、num2中復(fù)制過來的。也就是說a、b相當(dāng)于num1、num2的副本,副本的內(nèi)容無論怎么修改,都不會(huì)影響到原件本身。

引用傳遞

public static voidmain(String[] args) {int[] intArray = {1,2,3,4,5};

change(intArray);

System.out.println(intArray[0]);

}public static void change(int[] array) {int len =array.length;

array[0] = 0;

}

運(yùn)行結(jié)果:

0

流程

主函數(shù)進(jìn)棧,int[] intArray初始化。

調(diào)用change方法,change()進(jìn)棧,將intArray的地址值,復(fù)制一份給array。

change方法中,根據(jù)地址值,找到堆中的數(shù)組,并將第一個(gè)元素的值改為0。

change方法運(yùn)行完畢,數(shù)組中第一個(gè)元素的值已經(jīng)改變。

change方法彈棧。

主函數(shù)彈棧。

解析

調(diào)用change()的時(shí)候,形參array接收的是intArray地址值的副本。并在change方法中,通過地址值,對(duì)數(shù)組進(jìn)行操作。change方法彈棧以后,數(shù)組中的值已經(jīng)改變。main方法中,打印出來的intArray[0]也就從原來的1變成了0。

無論是主函數(shù),還是change方法,操作的都是同一個(gè)地址值對(duì)應(yīng)的數(shù)組。

就像你把自己家的鑰匙給了一把給保姆,保姆拿到鑰匙在你家打掃衛(wèi)生,結(jié)束后走了。等你拿著鑰匙回到家以后,家里已經(jīng)煥然一新。這里的鑰匙就相當(dāng)于地址值,家就相當(dāng)于數(shù)組本身。

String類型傳遞

public static voidmain(String[] args) {

String str= "ABC";

change(str);

System.out.println(str);

}public static voidchange(String a) {

a= "DEF";

}

運(yùn)行結(jié)果:

ABC

這就奇怪了。String是一個(gè)類,類是類引用類型,作為參數(shù)傳遞的時(shí)候,應(yīng)該是引用傳遞。但是從結(jié)果看起來卻是值傳遞。

原因

String的Api文檔中有這么一句話:

意思是String的值在創(chuàng)建之后不能被改變。

Api中還有一段:

意思是

String str = "abc";

相當(dāng)于:char data[] = {'a', 'b', 'c'};

String str= new String(data);

也就是說對(duì)String類型的str的任何修改相當(dāng)于重新創(chuàng)建一個(gè)對(duì)象,并將新的地址值賦給str。這樣的話,上面的代碼就可以寫成這樣:

public static voidmain(String[] args) {

String str1= "ABC";

change(str1);

System.out.println(str1);

}public static voidchange(String a) {char data[] = {'D', 'E', 'F'};

String str= newString(data);

a=str;

}

流程

主函數(shù)進(jìn)棧,str1初始化。

調(diào)用change方法,change()進(jìn)棧,將str1的地址值復(fù)制一份給a。

change方法中,重新創(chuàng)建一個(gè)String對(duì)象"DEF",并將a指向了新的地址值。

change方法執(zhí)行完畢,a指向的地址值已經(jīng)發(fā)生改變。

change方法彈棧。

主函數(shù)彈棧。

解析

String對(duì)象作為參數(shù)傳遞時(shí),走的依然是引用傳遞,只不過String這個(gè)類比較特殊。String對(duì)象一旦創(chuàng)建,內(nèi)容便不可更改,每一次內(nèi)容的更改都是重新創(chuàng)建出來的新對(duì)象。當(dāng)change方法執(zhí)行完畢時(shí),a所指向的地址值已經(jīng)發(fā)生改變,而a本來的地址值就是復(fù)制過來的副本,所以并不能改變str1的值。

String類型類似情況

classUser {

String name;publicUser(String name) {this.name =name;

}

}public static voidmain(String[] args) {

User user= new User("張三");

change(user);

System.out.println(user.name);

}public static voidchange(User u) {

User user= new User("李四");

u=user;

}

運(yùn)行結(jié)果:

張三

總結(jié)

Java基本數(shù)據(jù)類型傳遞參數(shù)時(shí)是值傳遞;引用類型傳遞參數(shù)時(shí)是引用傳遞。

值傳遞時(shí),將實(shí)參的值傳遞一份給形參;引用傳遞時(shí),將實(shí)參的地址值傳遞一份給形參。

值傳遞時(shí),實(shí)參把它的值傳遞給對(duì)應(yīng)的形參,函數(shù)接收的是原始值的一個(gè)拷貝,此時(shí)內(nèi)存中存在兩個(gè)相等的基本類型,即實(shí)參和形參,后面方法中的操作都是對(duì)形參這個(gè)值的修改,不影響實(shí)參的值。引用傳遞時(shí),實(shí)參的引用(地址,而不是參數(shù)的值)被傳遞給方法中相對(duì)應(yīng)的形參,函數(shù)接收的是原始值的內(nèi)存地址;在方法執(zhí)行中,形參和實(shí)參內(nèi)容相同,指向同一塊內(nèi)存地址,方法執(zhí)行中對(duì)引用的操作將會(huì)影響到實(shí)際對(duì)象。

需要特殊考慮String,以及Integer、Double等幾個(gè)基本類型包裝類,它們都是immutable類型,因?yàn)闆]有提供自身修改的函數(shù),每次操作都是新創(chuàng)建一個(gè)對(duì)象,所以要特殊對(duì)待。因?yàn)樽詈蟮牟僮鞑粫?huì)修改實(shí)參,可以認(rèn)為是和基本數(shù)據(jù)類型相似,為值傳遞。

總結(jié)

以上是生活随笔為你收集整理的java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。