欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java經(jīng)典問題:傳值還是傳引用(轉)

java經(jīng)典問題:傳值還是傳引用(轉)[@more@]經(jīng)典的問題,但卻不容易弄懂,尤其對有c基礎的java程序員來說,更容易引起混亂,這里我試圖簡單點描述。

“java函數(shù)是傳值的,java函數(shù)傳遞的參數(shù)是對象的引用”

這兩句話好像初聽上去有些矛盾,但卻是事實,因而引起很多初學者的混亂。在這里我試圖據(jù)個簡單的例子來說明java的這個特性,可能不全面,希望大家來補全。


public class TestRef {

public static void main(String[] args)
{
ValueObject vo1 = new ValueObject("A", 1);
System.out.println("after vo1: " + vo1.getName()); //=A

changeValue1(vo1);
System.out.println("after changeValue1: " + vo1.getName());
//=A1, changed

changeValue2(vo1);
System.out.println("after changeValue2: " + vo1.getName());
//=A1, changeValue2內(nèi)部的賦值不會影響這里。
}

/**
* 使用vo1自身的函數(shù)對其內(nèi)部數(shù)據(jù)進行改變是有效的,函數(shù)外可反映出來
* 這種object稱為可變的(mutable)
* @param vo1
*/
private static void changeValue1(ValueObject vo1) {
vo1.setName("A1");
}

/**
* 在函數(shù)內(nèi)給vo1重新賦值不會改變函數(shù)外的原始值
* @param vo1
*/
private static void changeValue2(ValueObject vo1) {
vo1 = new ValueObject("B", 2);
System.out.println("inside changeValue2: "+ vo1.getName());
//=B,賦值操作引起的結果變化僅在changeValue2內(nèi)部有效
}
}

class ValueObject {

public ValueObject() {}

public ValueObject(String name, int id)
{
this.name = name;
this.id = id;
}

private String name;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



解釋,vo1作為一個object,當它被用作函數(shù)參數(shù)的時候傳遞給函數(shù)的是一個引用值,這個名稱有點怪,又有引用又有值,到底是引用還是值呢,就看你怎么理解了。如果你是去考試,官方的答案是值??墒强雌饋碛窒笠冒?,希望從這個例子,你能理解java參數(shù)傳遞和和C/C++程序中的引用傳遞的不同的地方。另外,這也是java作為OO語言的特性之一:封裝的體現(xiàn)。

先講一下對象賦值的關系,舉例來說,下列代碼:

ValueObject v2, v3;
v2 = new ValueObject("C", 3); 粗體的部分創(chuàng)建了一個數(shù)據(jù)結構,假設存放在內(nèi)存地址A000,賦值給句柄 v2
v3 = new ValueObject("D", 4); 粗體的部分創(chuàng)建了一個數(shù)據(jù)結構,假設存放在內(nèi)存地址B000,賦值給句柄 v3
v2 = v3; 這句話的作用是把操作B000的地址的句柄的值付給了v2的句柄,使得v2和v3一樣操作B000的地址,這意味著:
1.原來v2指向的地址A000變成無主的內(nèi)存地址,將自動被jvm回收。
2.既然v2和v3指向同一片地址,對v3的修改v2也能得到,反之亦然。

整理得下列代碼,請感興趣的朋友運行驗證
ValueObject v2 = new ValueObject("C", 3);
ValueObject v3 = new ValueObject("D", 4);
v2 = v3;
System.out.println("after v2=v3");
System.out.println("v2= "+ v2.getName());//=D
System.out.println("v3= "+ v3.getName());//=D
v3.setName("C1");
System.out.println("after v3 setnameTo C1");
System.out.println("vo2= "+ v2.getName());//=C1
System.out.println("vo3= "+ v3.getName());//=C1

因此,可以得出結論,java中對象的每個實例(instance, 比如vo1, v2, v3 都是ValueObject的實例)的內(nèi)存地址是唯一的,它一旦被創(chuàng)建,能夠對這個地址進行操作的就是每個實例自己,如果ValueObject類中沒有public void setName之類的方法對這個類的實例中的數(shù)據(jù)進行修改的話,程序是沒有任何別的方法可以修改ValueObject類的實例中的數(shù)據(jù),這個就是java的封裝特性。對于不提供修改內(nèi)部數(shù)據(jù)的方法的類,我們稱為不可變(immutable)的類。在函數(shù)中對傳入的參數(shù)變量進行賦值操作,只能在函數(shù)范圍內(nèi)改變局部變量指向的引用地址,但是不會改變原始地址的內(nèi)容。因此,在changeValue2(...)函數(shù)內(nèi)部的vo1和函數(shù)外的vo1雖然名字相同,但是實際上是不同的實例變量,只不過指向了和函數(shù)外的vo1同樣的地址,所以當我們用vo1=... 對其進行賦值的時候,只不過是把函數(shù)內(nèi)的臨時變量指向了新的地址,并沒有改變原始vo1內(nèi)存地址中的內(nèi)容。這就是在運行changeValue2(...)之后,vo1的值在main范圍內(nèi)仍然沒有被修改的原因。而changeValue1里面是調(diào)用的ValueObject本身的function來更改其內(nèi)容,因此是原始內(nèi)存地址中的數(shù)據(jù)被更改了,所以是全局有效的。

網(wǎng)站欄目:java經(jīng)典問題:傳值還是傳引用(轉)
URL網(wǎng)址:http://aaarwkj.com/article20/pdecco.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈網(wǎng)站建設、域名注冊、定制開發(fā)、網(wǎng)站營銷網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設
av黄色成人在线观看| 我要看黄色一级性生活片| 日本岛国免费一区二区| 麻豆视传媒短视频网站免费| 一级黄片一区二区三区| 亚洲欧美日韩国产99| 熟妇人妻久久中文字幕麻豆网| 免费观看国产性生活片| 亚洲一区二区三区日韩欧美| 中文字幕乱码亚洲中文在线| 亚洲自偷精品视频自拍| 午夜精品视频免费91| 国产视频在线一区二区| 国产v精品欧美精品v日韩| 韩国三级网站在线观看视频 | 欧美v日韩v亚洲综合国产高清 | av天天堂网在线播放| 国语对白刺激真实精品| 日韩熟女人妻一区二区| 熟女人妻视频一区二区| 熟年人妻一区二区三区| 最新日韩精品电影在线网| 丝袜亚洲激情欧美日韩偷拍| 真人国产一级美女免费视频| 久久亚洲一区二区麻豆偷| 久久精品国产亚洲av高清一区| 啄木乌欧美一区二区三| av黄色天堂在线观看| 日韩亚洲人成网站在线播放| 亚洲国产熟对白剧情一区二区| 国产老熟女一区二区三区| 色婷婷精品一区二区三区| 国产91精品系列在线观看| 国产av日韩精品一区二区三区| 久久亚洲春色中文字幕| 国产H精品在线观看| 国产亚洲精品精品国产亚洲 | 国模在线视频一区二区| 久久精品中文字幕人妻| 日韩精品视频一区二区在线观看| 日本不卡一二三区在线观看|