亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

Java返回可變引用對(duì)象問(wèn)題整理

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

1.問(wèn)題

/** * 輸出: 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)致修改實(shí)例 d時(shí)影響了 test 的值,原因是Date類生成的對(duì)象是可變的。

2.對(duì)象與對(duì)象變量

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

這兩個(gè)變量引用同一個(gè)對(duì)象(請(qǐng)參見(jiàn)圖 4-4 )。

Java返回可變引用對(duì)象問(wèn)題整理

但一個(gè)對(duì)象變量并沒(méi)有實(shí)際包含一個(gè)對(duì)象,而僅僅引用一個(gè)對(duì)象。

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

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

Java 對(duì)象變量與 C++ 的引用并不同

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

Date birthday; // Java

實(shí)際上,等同于

Date* birthday; // C++

所有的 Java 對(duì)象都存儲(chǔ)在堆中。 當(dāng)一個(gè)對(duì)象包含另一個(gè)對(duì)象變量時(shí), 這個(gè)變量依然

包含著指向另一個(gè)堆對(duì)象的指針。

3.更改器方法與訪問(wèn)器方法

上文還是沒(méi)有解釋清楚為什么Date類的對(duì)象是可變對(duì)象,原因在這。

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

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

此類只訪問(wèn)對(duì)象而不修改對(duì)象的方法有時(shí)稱為訪問(wèn)器方法(accessor method)

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

4.解決方法

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

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)類被實(shí)例化后,該類的成員變量均不可被改變。

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

5.2優(yōu)缺點(diǎn) 優(yōu)點(diǎn):

1.線程安全

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

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

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 白云精品视频国产专区 | 亚州一二区 | 久久久www成人免费精品 | 91久久精品一区二区 | 91香蕉国产在线观看免费永久 | 在线高清一级欧美精品 | 亚洲一区日韩一区欧美一区a | 精品视频久久久久 | 欧美一级欧美一级在线播放 | 黄色a三级免费看 | 成年女人看片免费视频频 | 国产精品v欧美精品v日本精 | 成人性视频在线三级 | 97精品国产综合久久久久久欧美 | 一级国产交换配乱淫 | 久久99国产精品久久99无号码 | 国产成人深夜福利短视频99 | 久久亚洲国产最新网站 | 亚洲美女视频免费 | 国产午夜永久福利视频在线观看 | 日本视频三区 | 日本高清在线精品一区二区三区 | 色青五月天 | 精品欧美成人高清在线观看2021 | 扒开双腿猛进入爽爽在线观看 | 成人合集大片bd高清在线观看 | 手机看片日本 | 中文字幕天堂最新版在线网 | 国产成人精品视频播放 | 国产一国产一级毛片视频在线 | 亚洲一区在线视频观看 | 国产欧美一区二区三区久久 | 777色狠狠一区二区三区 | 国产一区二区三区精品视频 | 免费观看国产网址你懂的 | 老外黑人欧美一级毛片 | 久久精品视频99 | 毛片网站免费在线观看 | 国产黄三级三·级三级 | 国产亚洲美女精品久久 | 亚洲国产国产综合一区首页 |