日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA 对象引用,以及对象赋值

發(fā)布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA 对象引用,以及对象赋值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

關(guān)鍵字: java對象 引用

Java對象及其引用

關(guān)于對象與引用之間的一些基本概念。

初學(xué)Java時,在很長一段時間里,總覺得基本概念很模糊。后來才知道,在許多Java書中,把對象和對象的引用混為一談。可是,如果我分不清對象與對象引用,那實在沒法很好地理解下面的面向?qū)ο蠹夹g(shù)。把自己的一點認(rèn)識寫下來,或許能讓初學(xué)Java的朋友們少走一點彎路。為便于說明,我們先定義一個簡單的類:class Vehicle {int passengers; int fuelcap;int mpg;}

有了這個模板,就可以用它來創(chuàng)建對象:

Vehicle veh1 = new Vehicle();

通常把這條語句的動作稱之為創(chuàng)建一個對象,其實,它包含了四個動作。

1)右邊的“new Vehicle”,是以Vehicle類為模板,在堆空間里創(chuàng)建一個Vehicle類對象(也簡稱為Vehicle對象)。

2)末尾的()意味著,在對象創(chuàng)建后,立即調(diào)用Vehicle類的構(gòu)造函數(shù),對剛生成的對象進(jìn)行初始化。構(gòu)造函數(shù)是肯定有的。如果你沒寫,Java會給你補(bǔ)上一個默認(rèn)的構(gòu)造函數(shù)。

3)左邊的“Vehicle veh 1”創(chuàng)建了一個Vehicle類引用變量。所謂Vehicle類引用,就是以后可以用來指向Vehicle對象的對象引用。

4)“=”操作符使對象引用指向剛創(chuàng)建的那個Vehicle對象。

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

Vehicle veh1;

veh1 = new Vehicle();

效果是一樣的。這樣寫,就比較清楚了,有兩個實體:一是對象引用變量,一是對象本身。

在堆空間里創(chuàng)建的實體,與在數(shù)據(jù)段以及棧空間里創(chuàng)建的實體不同。盡管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。不僅如此,我們仔細(xì)研究一下第二句,找找剛創(chuàng)建的對象叫什么名字?有人說,它叫“Vehicle”。不對,“Vehicle”是類(對象的創(chuàng)建模板)的名字。一個Vehicle類可以據(jù)此創(chuàng)建出無數(shù)個對象,這些對象不可能全叫“Vehicle”。對象連名都沒有,沒法直接訪問它。我們只能通過對象引用來間接訪問對象。為了形象地說明對象、引用及它們之間的關(guān)系,可以做一個或許不很妥當(dāng)?shù)谋扔鳌ο蠛帽仁且恢缓艽蟮臍馇?#xff0c;大到我們抓不住它。引用變量是一根繩, 可以用來系汽球。如果只執(zhí)行了第一條語句,還沒執(zhí)行第二條,此時創(chuàng)建的引用變量veh1還沒指向任何一個對象,它的值是null。引用變量可以指向某個對象,或者為null。它是一根繩,一根還沒有系上任何一個汽球的繩。執(zhí)行了第二句后,一只新汽球做出來了,并被系在veh1這根繩上。我們抓住這根繩,就等于抓住了那只汽球。再來一句:Vehicle veh2;

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

veh2 = veh1;

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

如果用下句再創(chuàng)建一個對象:

veh2 = new Vehicle();

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

從以上敘述再推演下去,我們可以獲得以下結(jié)論:

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

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

如果再來下面語句:veh1 = veh2;

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

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

由此看來,下面的語句應(yīng)該不合法吧?至少是沒用的吧?

new Vehicle();

不對。它是合法的,而且可用的。譬如,如果我們僅僅為了打印而生成一個對象,就不需要用引用變量來系住它。最常見的就是打印字符串:

System.out.println(“I am Java!”);

字符串對象“I am Java!”在打印后即被丟棄。有人把這種對象稱之為臨時對象。

對象與引用的關(guān)系將持續(xù)到對象回收。

Java對象及引用

Java對象及引用是容易混淆卻又必須掌握的基礎(chǔ)知識,本章闡述Java對象和引用的概念,以及與其密切相關(guān)的參數(shù)傳遞。

先看下面的程序:

StringBuffer s;

s = new StringBuffer("Hello World!");

第一個語句僅為引用(reference)分配了空間,而第二個語句則通過調(diào)用類(StringBuffer)的構(gòu)造函數(shù)StringBuffer(String str)為類生成了一個實例(或稱為對象)。這兩個操作被完成后,對象的內(nèi)容則可通過s進(jìn)行訪問——在Java里都是通過引用來操縱對象的。

Java對象和引用的關(guān)系可以說是互相關(guān)聯(lián),卻又彼此獨(dú)立。彼此獨(dú)立主要表現(xiàn)在:引用是可以改變的,它可以指向別的對象,譬如上面的s,你可以給它另外的對象,如:

s = new StringBuffer("Java");

這樣一來,s就和它指向的第一個對象脫離關(guān)系。

從存儲空間上來說,對象和引用也是獨(dú)立的,它們存儲在不同的地方,對象一般存儲在堆中,而引用存儲在速度更快的堆棧中。

引用可以指向不同的對象,對象也可以被多個引用操縱,如:

StringBuffer s1 = s;

這條語句使得s1和s指向同一個對象。既然兩個引用指向同一個對象,那么不管使用哪個引用操縱對象,對象的內(nèi)容都發(fā)生改變,并且只有一份,通過s1和s得到的內(nèi)容自然也一樣,(String除外,因為String始終不變,String s1=”AAAA”; String s=s1,操作s,s1由于始終不變,所以為s另外開辟了空間來存儲s,)如下面的程序:

StringBuffer s;

s = new StringBuffer("Java");

StringBuffer s1 = s;

s1.append(" World");

System.out.println("s1=" + s1.toString());//打印結(jié)果為:s1=Java World

System.out.println("s=" + s.toString());//打印結(jié)果為:s=Java World

上面的程序表明,s1和s打印出來的內(nèi)容是一樣的,這樣的結(jié)果看起來讓人非常疑惑,但是仔細(xì)想想,s1和s只是兩個引用,它們只是操縱桿而已,它們指向同一個對象,操縱的也是同一個對象,通過它們得到的是同一個對象的內(nèi)容。這就像汽車的剎車和油門,它們操縱的都是車速,假如汽車開始的速度是80,然后你踩了一次油門,汽車加速了,假如車速升到了120,然后你踩一下剎車,此時車速是從120開始下降的,假如下降到60,再踩一次油門,車速則從60開始上升,而不是從第一次踩油門后的120開始。也就是說車速同時受油門和剎車影響,它們的影響是累積起來的,而不是各自獨(dú)立(除非剎車和油門不在一輛車上)。所以,在上面的程序中,不管使用s1還是s操縱對象,它們對對象的影響也是累積起來的(更多的引用同理)。

只有理解了對象和引用的關(guān)系,才能理解參數(shù)傳遞。

一般面試題中都會考Java傳參的問題,并且它的標(biāo)準(zhǔn)答案是Java只有一種參數(shù)傳遞方式:那就是按值傳遞,即Java中傳遞任何東西都是傳值。如果傳入方法的是基本類型的東西,你就得到此基本類型的一份拷貝。如果是傳遞引用,就得到引用的拷貝。

一般來說,對于基本類型的傳遞,我們很容易理解,而對于對象,總讓人感覺是按引用傳遞,看下面的程序:

public class ObjectRef {

//基本類型的參數(shù)傳遞public static void testBasicType(int m) {System.out.println("m=" + m);//m=50m = 100;System.out.println("m=" + m);//m=100}//參數(shù)為對象,不改變引用的值 ??????public static void add(StringBuffer s) {s.append("_add");}//參數(shù)為對象,改變引用的值 ?????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}

}

以上程序的允許結(jié)果顯示出,testBasicType方法的參數(shù)是基本類型,盡管參數(shù)m的值發(fā)生改變,但并不影響i。

add方法的參數(shù)是一個對象,當(dāng)把sMain傳給參數(shù)s時,s得到的是sMain的拷貝,所以s和sMain指向同一個對象,因此,使用s操作影響的其實就是sMain指向的對象,故調(diào)用add方法后,sMain指向的對象的內(nèi)容發(fā)生了改變。在changeRef方法中,參數(shù)也是對象,當(dāng)把sMain傳給參數(shù)s時,s得到的是sMain的拷貝,但與add方法不同的是,在方法體內(nèi)改變了s指向的對象(也就是s指向了別的對象,牽著氣球的繩子換氣球了),給s重新賦值后,s與sMain已經(jīng)毫無關(guān)聯(lián),它和sMain指向了不同的對象,所以不管對s做什么操作,都不會影響sMain指向的對象,故調(diào)用changeRef方法前后sMain指向的對象內(nèi)容并未發(fā)生改變。

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

public class Test { public int i,j;
public void test_m(Test a) { Test b = new Test(); b.i = 1; b.j = 2; a = b; } public void test_m1(Test a ) { a.i = 1; a.j = 2; } public static void main(String argv[]) { Test t= new Test(); t.i = 5; t.j = 6; System.out.println( "t.i = "+ t.i + " t.j= " + t.j); //5,6 t.test_m(t); System.out.println( "t.i = "+ t.i + " t.j= " + t.j); //5,6,a和t都指向了一個對象,而在test_m中s又指向了另一個對象,所以對象t不變!!!

t.test_m1(t);System.out.println( "t.i = "+ t.i + " t.j= " + t.j); //1,2}

}

答案只有一個:Java里都是按值傳遞參數(shù)。而實際上,我們要明白,當(dāng)參數(shù)是對象時,傳引用會發(fā)生什么狀況(就像上面的add方法)?

=========================================================================

樓主,這樣來記這個問題 如下表達(dá)式: A a1 = new A(); 它代表A是類,a1是引用,a1不是對象,new A()才是對象,a1引用指向new A()這個對象。

在JAVA里,“=”不能被看成是一個賦值語句,它不是在把一個對象賦給另外一個對象,它的執(zhí)行過程實質(zhì)上是將右邊對象的地址傳給了左邊的引用,使得左邊的引用指向了右邊的對象。JAVA表面上看起來沒有指針,但它的引用其實質(zhì)就是一個指針,引用里面存放的并不是對象,而是該對象的地址,使得該引用指向了對象。在JAVA里,“=”語句不應(yīng)該被翻譯成賦值語句,因為它所執(zhí)行的確實不是一個賦值的過程,而是一個傳地址的過程,被譯成賦值語句會造成很多誤解,譯得不準(zhǔn)確。

再如: A a2; 它代表A是類,a2是引用,a2不是對象,a2所指向的對象為空null;

再如: a2 = a1; 它代表,a2是引用,a1也是引用,a1所指向的對象的地址傳給了a2(傳址),使得a2和a1指向了同一對象。

綜上所述,可以簡單的記為,在初始化時,“=”語句左邊的是引用,右邊new出來的是對象。 在后面的左右都是引用的“=”語句時,左右的引用同時指向了右邊引用所指向的對象。

再所謂實例,其實就是對象的同義詞。

如果需要賦值,就需要類實現(xiàn)Cloneable接口,實現(xiàn)clone()方法。

1 2 3 4 5 6 7 8 9 10 11 class D implements Cloneable{//實現(xiàn)Cloneable接口 String sex; D(String sex){ this.sex=sex; } @Override protected Object clone() throws CloneNotSupportedException { // 實現(xiàn)clone方法 return super.clone(); } } 賦值的時候:

1 2 D d=new D("男"); D d2=(D) d.clone();//把d賦值給d2 如果類中的變量不是主類型,而是對象,也需要調(diào)用該對象的clone()方法 下面是一個完整的例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public class Test2 { public static void main(String[] args) throws CloneNotSupportedException { // TODO Auto-generated method stub D d=new D("男"); C c=new C("張三","20",d); C new_c=(C) c.clone();//調(diào)用clone方法來賦值 new_c.name="李四"; d.sex="女";//d System.out.println(c.d.sex); System.out.println(c.name);

}

}

class C implements Cloneable{ String name; String age; D d; C(String name,String age,D d) throws CloneNotSupportedException{ this.name=name; this.age=age; this.d=(D) d.clone();//調(diào)用clone方法來賦值,這樣即便外部的d發(fā)生變化,c里的也不會變 } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } } class D implements Cloneable{//實現(xiàn)Cloneable接口 String sex; D(String sex){ this.sex=sex; } @Override protected Object clone() throws CloneNotSupportedException { // 實現(xiàn)clone方法 return super.clone(); } }

轉(zhuǎn)載于:https://my.oschina.net/u/1388978/blog/225373

總結(jié)

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

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

主站蜘蛛池模板: 日韩爽片| 大学生三级中国dvd 日韩欧美一区二区区 | 在线免费毛片 | 94av| 2025国产精品 | av怡红院| 69视频网址 | 日本少妇bbwbbw精品 | 中国精品视频 | 亚洲中文字幕久久无码 | 国产精品手机在线 | 四虎5151久久欧美毛片 | 亚洲国产精品久久久久爰性色 | 最新av免费在线观看 | 女人被男人躁得好爽免费视频 | 欧美操操操 | 久草影视网| 中文字幕亚洲一区二区三区五十路 | 国产资源久久 | 久草免费资源站 | 日韩成人一区二区 | 哈利波特3在线观看免费版英文版 | 在线中文字幕日韩 | 亚洲AV午夜福利精品一级无码 | 插插插日日日 | 天天撸在线视频 | 久久9久久 | 欧美黄色片网站 | 欧美在线视频免费播放 | 日韩精品在线观看一区二区 | 91香蕉黄| 国产午夜在线观看 | 色综合天天综合网国产成人网 | 国产一卡二卡在线播放 | 好吊妞精品 | 99青青草 | 午夜小视频在线播放 | 日韩中文字幕免费在线观看 | 男人天堂影院 | 国产免费a视频 | 中文字幕在线永久 | 天堂资源在线播放 | 日噜| 国产一级黄色录像 | 麻豆福利在线观看 | 国产喷白浆一区二区三区 | 亚洲婷婷小说 | 电影《两个尼姑》免费播放 | 99精品久久久久久中文字幕 | 91av在线视频播放 | 国产男女猛烈无遮挡免费视频动漫 | sm捆绑调教视频 | 黄色片视频免费在线观看 | 波多野结衣一二三区 | 一区二区三区欧美日韩 | 久久99久久99精品中文字幕 | 日韩在线观看 | 欧美精品观看 | 国产美女视频91 | 日本黄a三级三级三级 | 黄色成年网站 | 求毛片网站 | 中文字幕无码日韩专区免费 | 啪啪福利社 | 又爽又黄又无遮挡 | 日美韩av| 尤物视频在线观看视频 | 男人天堂手机在线观看 | www.com黄色 | 99在线精品免费视频 | 国产精品视频区 | 在线va视频 | 国产亚洲精品久久久久久777 | 欧美国产三级 | 国产欧美视频一区 | 成人高清视频免费观看 | 大香蕉毛片| 日韩插插 | 找av导航 | 国产麻豆网 | 亚洲欧美日韩另类 | 精品久久久久久久久久久aⅴ | 另类图片亚洲色图 | 亚洲最大成人综合网 | 男插女在线观看 | 性做爰裸体按摩视频 | 色呦呦免费观看 | 国产精品呦呦 | 天天想你在线观看完整版高清 | 国产高清一区在线 | 欧美在线视频观看 | 亚欧在线免费观看 | 国产人妻久久精品一区二区三区 | 日本黄网站色大片免费观看 | 日日草夜夜操 | av毛片网| 欧美日韩美女 | 成人观看网站 | 老熟妇高潮一区二区高清视频 |