欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
51Testing軟件測試網(wǎng):java經(jīng)典問(wèn)題:傳值還是傳引用

經(jīng)典的問(wèn)題,但卻不容易弄懂,尤其對有c基礎的java程序員來(lái)說(shuō),更容易引起混亂,這里我試圖簡(jiǎn)單點(diǎn)描述。

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

這兩句話(huà)好像初聽(tīng)上去有些矛盾,但卻是事實(shí),因而引起很多初學(xué)者的混亂。在這里我試圖據個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明java的這個(gè)特性,可能不全面,希望大家來(lái)補全。


CODE: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內部的賦值不會(huì )影響這里。
        }

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

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

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;
        }
}
解釋?zhuān)瑅o1作為一個(gè)object,當它被用作函數參數的時(shí)候傳遞給函數的是一個(gè)引用值,這個(gè)名稱(chēng)有點(diǎn)怪,又有引用又有值,到底是引用還是值呢,就看你怎么理解了。如果你是去考試,官方的答案是值??墒强雌饋?lái)又象引用啊,希望從這個(gè)例子,你能理解java參數傳遞和和C/C++程序中的引用傳遞的不同的地方。另外,這也是java作為OO語(yǔ)言的特性之一:封裝的體現。

先講一下對象賦值的關(guān)系,舉例來(lái)說(shuō),下列代碼:

ValueObject v2, v3;
v2 = new ValueObject("C", 3); 粗體的部分創(chuàng )建了一個(gè)數據結構,假設存放在內存地址A000,賦值給句柄 v2
v3 = new ValueObject("D", 4); 粗體的部分創(chuàng )建了一個(gè)數據結構,假設存放在內存地址B000,賦值給句柄 v3
v2 = v3; 這句話(huà)的作用是把操作B000的地址的句柄的值付給了v2的句柄,使得v2和v3一樣操作B000的地址,這意味著(zhù):
1.原來(lái)v2指向的地址A000變成無(wú)主的內存地址,將自動(dòng)被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中對象的每個(gè)實(shí)例(instance, 比如vo1, v2, v3 都是ValueObject的實(shí)例)的內存地址是唯一的,它一旦被創(chuàng )建,能夠對這個(gè)地址進(jìn)行操作的就是每個(gè)實(shí)例自己,如果ValueObject類(lèi)中沒(méi)有public void setName之類(lèi)的方法對這個(gè)類(lèi)的實(shí)例中的數據進(jìn)行修改的話(huà),程序是沒(méi)有任何別的方法可以修改ValueObject類(lèi)的實(shí)例中的數據,這個(gè)就是java的封裝特性。對于不提供修改內部數據的方法的類(lèi),我們稱(chēng)為不可變(immutable)的類(lèi)。在函數中對傳入的參數變量進(jìn)行賦值操作,只能在函數范圍內改變局部變量指向的引用地址,但是不會(huì )改變原始地址的內容。因此,在changeValue2(...)函數內部的vo1和函數外的vo1雖然名字相同,但是實(shí)際上是不同的實(shí)例變量,只不過(guò)指向了和函數外的vo1同樣的地址,所以當我們用vo1=... 對其進(jìn)行賦值的時(shí)候,只不過(guò)是把函數內的臨時(shí)變量指向了新的地址,并沒(méi)有改變原始vo1內存地址中的內容。這就是在運行changeValue2(...)之后,vo1的值在main范圍內仍然沒(méi)有被修改的原因。而changeValue1里面是調用的ValueObject本身的function來(lái)更改其內容,因此是原始內存地址中的數據被更改了,所以是全局有效的。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java中只有按值傳遞,沒(méi)有按引用傳遞!
關(guān)于POJO及DAO
使用Eclipse的Ast解析java源代碼~~~~ - rwl6813021 - Jav...
Java函數式開(kāi)發(fā)——優(yōu)雅的Optional空指針處理(一)
黑馬程序員ava學(xué)習筆記
反射 — Java 高級開(kāi)發(fā)必須懂的
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久