溫馨提示×

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

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

java通過(guò)實(shí)例了解值傳遞和引用傳遞

發(fā)布時(shí)間:2020-10-03 06:14:12 來(lái)源:腳本之家 閱讀:113 作者:陳晨辰 欄目:編程語(yǔ)言

這篇文章主要介紹了java通過(guò)實(shí)例了解值傳遞和引用傳遞,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一.java中的值傳遞的問(wèn)題

指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按值的拷貝傳遞。示例如下:

public static void main(String[] args) {
	int a=1;
	change(a);
	System.out.println("交換a后的值:"+a);
}
private static void change(int a) {
	a=1111;
	System.out.println("交換方法里面的a:"+a);
}
//運(yùn)行輸出
//交換方法里面的a:1111
//交換a后的值:1

按值傳遞重要特點(diǎn):傳遞的是值的拷貝,也就是說(shuō)傳遞后就互不相關(guān)了。

二.java中的引用傳遞的問(wèn)題

指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按引用進(jìn)行傳遞,其實(shí)傳遞的引用的地址,也就是變量所對(duì)應(yīng)的內(nèi)存空間的地址。示例如下:

public static void main(String[] args) {
	Person p=new Person();
	p.setAge(25);
	changeAge(p);
	System.out.println("改變年齡后的年齡:"+p.getAge());
}
private static void changeAge(Person p) {
	p.setAge(35);
	System.out.println("改變年齡方法里面的年齡:"+p.getAge());
}
//運(yùn)行輸出
//改變年齡方法里面的年齡:35
//改變年齡后的年齡:35
class Person{
	private int age=10;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

傳遞的是值的引用,也就是說(shuō)傳遞前和傳遞后都指向同一個(gè)引用(也就是同一個(gè)內(nèi)存空間),引用類(lèi)型的傳遞后的修改會(huì)影響原來(lái)的值。

從上面兩個(gè)例子來(lái)看,基本數(shù)據(jù)類(lèi)型的傳遞是值傳遞,傳遞過(guò)去的是具體的數(shù)值;而引用數(shù)據(jù)類(lèi)型的傳遞是引用傳遞,傳遞過(guò)去的是內(nèi)存的地址。其實(shí)不然,請(qǐng)看下面的兩個(gè)例子。

三.到底是值傳遞還是引用傳遞

請(qǐng)看下面一個(gè)例子,String類(lèi)型也算是引用數(shù)據(jù)類(lèi)型,把上面第一個(gè)值傳遞的里面的整形換成字符串類(lèi)型,例子代碼如下:

public static void main(String[] args) {
	String str="哈哈我是字符串";
	change(str);
	System.out.println("交換字符串后的值:"+str);
}
private static void change(String str) {
	str="我在里面被交換了";
	System.out.println("交換方法里面的字符串:"+str);
}
//交換方法里面的字符串:我在里面被交換了
//交換字符串后的值:哈哈我是字符串

交換以后,引用類(lèi)型的傳遞str并沒(méi)有改變,嘗試使用String s=new String("xxx");嘗試還是沒(méi)有改變.如果說(shuō)String類(lèi)比較特殊,請(qǐng)看下面的例子。

public static void main(String[] args) {
	Person p=new Person();
	p.setAge(25);
	changeAge(p);
	System.out.println("改變年齡后的年齡:"+p.getAge());
}
private static void changeAge(Person p) {
	p=new Person();
	p.setAge(35);
	System.out.println("改變年齡方法里面的年齡:"+p.getAge());
}
//運(yùn)行輸出
//改變年齡方法里面的年齡:35
//改變年齡后的年齡:25

我們?cè)诜椒ɡ锩嬷匦赂淖僷erson對(duì)象的指向,這時(shí)如果是引用傳遞,必然會(huì)導(dǎo)致p對(duì)象里面的age發(fā)生改變,但是實(shí)際上并未改變。這里確實(shí)是按照引用傳遞的,但是傳遞的還是引用的一個(gè)副本,并不是原始的引用本身。在 Java 應(yīng)用程序中,當(dāng)對(duì)象引用是傳遞給方法的一個(gè)參數(shù)時(shí),您傳遞的是該引用的一個(gè)副本(可以認(rèn)為特殊的值傳遞),而不是引用本身。

四.總結(jié)

在java里面,一般不可變的對(duì)象 例于String 和8大基本數(shù)據(jù)類(lèi)型的這些,都是值的傳遞,其他引用數(shù)據(jù)類(lèi)型的傳遞是引用副本的傳遞。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

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

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

AI