亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Java返回可變引用對象問題整理

瀏覽:82日期:2022-09-02 11:50:40

1.問題

/** * 輸出: Mon Apr 26 10:54:10 CST 2010 * Mon Apr 26 10:54:10 CST 2010 */public static void main(String[] args){ Example test = new Example(new Date()); Date d = test.getDate(); double tenYearsInMillisSeconds = 10 * 365.25 * 24 * 3600 * 1000; d.setTime((long) (d.getTime() - tenYearsInMillisSeconds)); System.out.println(d); System.out.println(test.getDate());}public class Example { private Date date; public Example(Date date){ this.date = date; } public Date getDate() { return date; }}

Date類破壞了Example的封裝,導(dǎo)致修改實例 d時影響了 test 的值,原因是Date類生成的對象是可變的。

2.對象與對象變量

Date birthday = new Date();Date deadline = birthday;

這兩個變量引用同一個對象(請參見圖 4-4 )。

Java返回可變引用對象問題整理

但一個對象變量并沒有實際包含一個對象,而僅僅引用一個對象。

在 Java 中,任何對象變量的值都是對存儲在另外一個地方的一個對象的引用。new 操作符的返回值也是一個引用。

Date birthday = new Date();可以理解為new Date() 構(gòu)造了一個 Date 類型的對象, 并且它的值是對新創(chuàng)建對象的引用。這個引用存儲在變量 birthday中。

Java 對象變量與 C++ 的引用并不同

可以將 Java 的對象變量看作 C++ 的對象指針。例如,

Date birthday; // Java

實際上,等同于

Date* birthday; // C++

所有的 Java 對象都存儲在堆中。 當(dāng)一個對象包含另一個對象變量時, 這個變量依然

包含著指向另一個堆對象的指針。

3.更改器方法與訪問器方法

上文還是沒有解釋清楚為什么Date類的對象是可變對象,原因在這。

假設(shè)在上文中Example類中使用Java中與Date類相近的LocalDate類便不會出現(xiàn)上述情況,測試可以自己去嘗試。

原因在于假設(shè)使用LocalDate類中的plusDays 方法來修改對象變量,它會生成一個新的LocalDate對象,然后把這個新對象賦值給調(diào)用者,原來的對象不做任何改動。

此類只訪問對象而不修改對象的方法有時稱為訪問器方法(accessor method)

而像Date類中的setTime方法會使得原對象的狀態(tài)發(fā)生改變,此類稱為更改器方法(mutator method)

4.解決方法

如果需要返回一個可變數(shù)據(jù)域的拷貝,就應(yīng)該使用 clone。這樣會創(chuàng)建一個當(dāng)前對象的副本,而不會對當(dāng)前對象造成影響。

public class Example { private Date date; public Example(Date date){ this.date = date; } public Date getDate() {return (Date) date.clone(); }}

5.不可變類

5.1什么是不可變類

不可變類指當(dāng)類被實例化后,該類的成員變量均不可被改變。

如JDK內(nèi)部自帶的很多不可變類Interger、Long、 Boolean和String等。

5.2優(yōu)缺點 優(yōu)點:

1.線程安全

2.易于構(gòu)造、使用和測試

3.可以被自由地共享缺點:對于每一個不同的值都需要對應(yīng)一個單獨的對象 5.3如何實現(xiàn)不可變類 Class需要用final修飾,保證類不能被繼承所有成員變量需要private修飾,保證成員變量不能直接被訪問類中不允許提供setter方法,保證成員變量不會被改變在getter方法中不能返回對象本身,返回對象的拷貝

到此這篇關(guān)于Java返回可變引用對象問題整理的文章就介紹到這了,更多相關(guān)Java返回可變引用對象問題內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 鲁一鲁中文字幕久久 | 农村寡妇一级毛片免费播放 | 激情欧美成人狠狠色金八天国 | 国产精品久久精品视 | 日韩免费毛片视频 | 在线免费国产视频 | 欧美综合精品一区二区三区 | 国产欧美日韩第一页 | 国产精品综合一区二区 | 国产黄色福利 | 一级做a爱片特黄在线观看yy | 亚洲欧美一区二区三区另类 | 亚洲国产一成人久久精品 | 国产精品嫩草影院在线看 | 天天做天天爱天天影视综合 | 国产亚洲精品aa在线观看 | 极品色αv影院 | 国产精品线在线精品国语 | 大狠狠大臿蕉香蕉大视频 | 国产高清japanese国产在线观看 | 一区二区三区无码高清视频 | 一级做a爱过程免费视频时看 | 台湾永久内衣秀86部钟真 | 日本欧美中文字幕 | 9久re在线观看视频精品 | 国产第一区精品视频ai换脸 | 看一级毛片 | 亚洲人成网国产最新在线 | 亚欧在线一线 | 91成人国产福利 | 国产一级性片 | 国产精品日本一区二区不卡视频 | 精品国产免费一区二区 | 免费观看a级毛片在线播放 免费观看a级片 | 永久免费在线视频 | 尤物视频在线观看视频 | 中国一级簧色 | 国产人成午夜免费噼啪视频 | 外国一级黄色片 | 99久久免费国产精品m9 | 黄片毛片免费看 |