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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java 对象引用以及对象赋值

發布時間:2024/4/17 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 对象引用以及对象赋值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Vehicle veh1 = new Vehicle();

通常這條語句執行的動作被稱為創建一個對象,其實他包含了四個動作。

1.new Vehicle ?:表示在堆空間內創建了一個Vehicle類的對象。

2.():表示調用Vehicle的構造函數,初始化新創建的對象。

3.Vehicle veh1 :表示在??臻g內創建了一個Vehicle類的引用。

4. = :表示把??臻g的這個引用指向堆空間內的對象。

?

二、對象引用和對象之間的關系

我們可以把這條語句拆成兩部分:

Vehicle veh1;

veh1 = new Vehicle();

對象好比是一只很大的氣球,大到我們抓不住它。引用變量是一根繩, 可以用來系汽球。?如果只執行了第一條語句,還沒執行第二條,此時創建的引用變量veh1還沒指向任何一個對象,它的值是null。引用變量可以指向某個對象,或者為null。?它是一根繩,一根還沒有系上任何一個汽球的繩。執行了第二句后,一只新汽球做出來了,并被系在veh1這根繩上。我們抓住這根繩,就等于抓住了那只汽球。

?Vehicle veh2;

就又做了一根繩,還沒系上汽球。如果再加一句:

?veh2 = veh1;

系上了。這里,發生了復制行為。但是,要說明的是,對象本身并沒有被復制,被復制的只是對象引用。結果是,veh2也指向了veh1所指向的對象。兩根繩系的是同一只汽球。

如果用下句再創建一個對象:

veh2 = new Vehicle();

則引用變量veh2改指向第二個對象。

?從以上敘述再推演下去,我們可以獲得以下結論:

(1)一個對象引用可以指向0個或1個對象(一根繩子可以不系汽球,也可以系一個汽球);

(2)一個對象可以有N個引用指向它(可以有N條繩子系住一個汽球)。

???????如果再來下面語句:

?????? veh1 = veh2;

按上面的推斷,veh1也指向了第二個對象。這個沒問題。問題是第一個對象呢?沒有一條繩子系住它,它飛了。多數書里說,它被Java的垃圾回收機制回收了。

這不確切。正確地說,它已成為垃圾回收機制的處理對象。至于什么時候真正被回收,那要看垃圾回收機制的心情了。

?

三 例程分析

public class ObjectRef {//基本類型的參數傳遞public static void testBasicType(int m) {System.out.println("m=" + m);//m=50m = 100;System.out.println("m=" + m);//m=100}//參數為對象,不改變引用的值 ??????public static void add(StringBuffer s) {s.append("_add");}
//參數為對象,改變引用的值 ?????public static void changeRef(StringBuffer s) {s = new StringBuffer("Java");}
public static void main(String[] args) {int i = 50;testBasicType(i);System.out.println(i);//i=50StringBuffer sMain = new StringBuffer("init");System.out.println("sMain=" + sMain.toString());//sMain=initadd(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_addchangeRef(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_add}}

  

  add方法的參數是一個對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,所以s和sMain指向同一個對象,因此,使用s操作影響的其實就是sMain指向的對象,故調用add方法后,sMain指向的對象的內容發生了改變。

??????在changeRef方法中,參數也是對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,但與add方法不同的是,在方法體內改變了s指向的對象(也就是s指向了別的對象,牽著氣球的繩子換氣球了),給s重新賦值后,ssMain已經毫無關聯,它和sMain指向了不同的對象,所以不管對s做什么操作,都不會影響sMain指向的對象,故調用changeRef方法前后sMain指向的對象內容并未發生改變。

?  對于add方法的調用結果,可能很多人會有這種感覺:這不明明是按引用傳遞嗎?對于這種問題,還是套用Bruce Eckel的話:這依賴于你如何看待引用,最終你會明白,這個爭論并沒那么重要。真正重要的是,你要理解,傳引用使得(調用者的)對象的修改變得不可預期。

?

參考原文:http://www.cnblogs.com/focusChen/articles/2497768.html

轉載于:https://www.cnblogs.com/lyr2015/p/6432170.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Java 对象引用以及对象赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。