最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月26日 08:11:29   作者:花染夢(mèng)  
在本篇文章里小編給大家分享的是關(guān)于Java返回可變引用對(duì)象問題整理內(nèi)容,需要的朋友們可以學(xué)習(xí)下。

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

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

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

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

但一個(gè)對(duì)象變量并沒有實(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.更改器方法與訪問器方法

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

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

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

此類只訪問對(duì)象而不修改對(duì)象的方法有時(shí)稱為訪問器方法(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)部自帶的很多不可變類IntergerLong、 BooleanString等。

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修飾,保證成員變量不能直接被訪問類中不允許提供setter方法,保證成員變量不會(huì)被改變?cè)?code>getter方法中不能返回對(duì)象本身,返回對(duì)象的拷貝

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

相關(guān)文章

  • java如何將可運(yùn)行jar打包成exe可執(zhí)行文件

    java如何將可運(yùn)行jar打包成exe可執(zhí)行文件

    Java程序完成以后,對(duì)于Windows操作系統(tǒng)習(xí)慣總是想雙擊某個(gè)exe文件就可以直接運(yùn)行程序,這篇文章主要給大家介紹了關(guān)于java如何將可運(yùn)行jar打包成exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 詳解@Autowired是如何注入變量的

    詳解@Autowired是如何注入變量的

    在?Spring?容器中,當(dāng)我們想給某一個(gè)屬性注入值的時(shí)候,有多種不同的方式,例如使用?@Autowired、@Inject等注解,下面小編就來和小伙伴們聊一聊,@Autowired?到底是如何把數(shù)據(jù)注入進(jìn)來的
    2023-07-07
  • 用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    這篇文章主要介紹了用SpringBoot+Vue+uniapp實(shí)現(xiàn)在線房屋裝修管理系統(tǒng),針對(duì)裝修樣板信息管理混亂,出錯(cuò)率高,信息安全性差,勞動(dòng)強(qiáng)度大,費(fèi)時(shí)費(fèi)力等問題開發(fā)了這套系統(tǒng),需要的朋友可以參考下
    2023-03-03
  • 10種簡(jiǎn)單的Java性能優(yōu)化

    10種簡(jiǎn)單的Java性能優(yōu)化

    你是否正打算優(yōu)化hashCode()方法?是否想要繞開正則表達(dá)式?Lukas Eder介紹了很多簡(jiǎn)單方便的性能優(yōu)化小貼士以及擴(kuò)展程序性能的技巧
    2017-11-11
  • Spring框架AOP基礎(chǔ)之代理模式詳解

    Spring框架AOP基礎(chǔ)之代理模式詳解

    代理模式(Proxy Parttern)為一個(gè)對(duì)象提供一個(gè)替身,來控制這個(gè)對(duì)象的訪問,即通過代理對(duì)象來訪問目標(biāo)對(duì)象。本文將通過示例詳細(xì)講解一下這個(gè)模式,需要的可以參考一下
    2022-11-11
  • Spring使用@Filter注解創(chuàng)建自定義過濾器

    Spring使用@Filter注解創(chuàng)建自定義過濾器

    Spring 中鮮為人知但非常有用的注解之一是 @Filter,它支持自定義過濾器,下面我們就來深入研究一下如何使用 Spring 的 @Filter 注解來創(chuàng)建自定義過濾器吧
    2023-11-11
  • 使用Java和PostgreSQL存儲(chǔ)向量數(shù)據(jù)的實(shí)現(xiàn)指南

    使用Java和PostgreSQL存儲(chǔ)向量數(shù)據(jù)的實(shí)現(xiàn)指南

    在當(dāng)今的數(shù)字化時(shí)代,數(shù)據(jù)存儲(chǔ)的方式和技術(shù)正變得越來越復(fù)雜和多樣化,隨著機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)的發(fā)展,向量數(shù)據(jù)的存儲(chǔ)和管理變得尤為重要,本文將詳細(xì)介紹如何使用 Java 和 PostgreSQL 數(shù)據(jù)庫來存儲(chǔ)向量數(shù)據(jù),需要的朋友可以參考下
    2024-09-09
  • 如何通過Java打印Word文檔

    如何通過Java打印Word文檔

    這篇文章主要介紹了如何通過Java打印Word文檔,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 深入理解Spring中RabbitMQ的Channel

    深入理解Spring中RabbitMQ的Channel

    這篇文章主要介紹了深入理解Spring中RabbitMQ的Channel,在RabbitMq中,channel表示邏輯連接或者叫虛擬連接,是棣屬于TCP連接的,一個(gè)TCP連接里可以創(chuàng)建多個(gè)channel,在Rabbit MQ里,消息的發(fā)送和接收都是基于channel的,需要的朋友可以參考下
    2023-08-08
  • javax.management.InvalidApplicationException的問題解決

    javax.management.InvalidApplicationException的問題解決

    javax.management.InvalidApplicationException是與Java Management Extensions (JMX) API相關(guān)的一個(gè)常見異常,本文主要介紹了javax.management.InvalidApplicationException的問題解決,感興趣的可以了解一下
    2024-08-08

最新評(píng)論

隆尧县| 乐东| 宁乡县| 青田县| 平南县| 晋中市| 平湖市| 宝清县| 满洲里市| 阿尔山市| 泽州县| 新乐市| 石嘴山市| 黑山县| 页游| 双辽市| 塔城市| 遂川县| 齐齐哈尔市| 梁山县| 东安县| 怀宁县| 集贤县| 广河县| 天全县| 永嘉县| 拉萨市| 祥云县| 温泉县| 五指山市| 浦县| 安庆市| 乃东县| 乐清市| 四会市| 连城县| 普安县| 香港 | 勃利县| 阿瓦提县| 武夷山市|