国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

Java中的“ final”關(guān)鍵字如何工作?(我仍然可以修改對(duì)象)

瀏覽:111日期:2024-05-07 08:25:19
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解決Java中的“ final”關(guān)鍵字如何工作?(我仍然可以修改對(duì)象)?

你總是允許初始化一個(gè)final變量。編譯器確保你只能執(zhí)行一次。

請(qǐng)注意,對(duì)存儲(chǔ)在final變量中的對(duì)象的調(diào)用方法與的語義無關(guān)final。換句話說:final僅與引用本身有關(guān),而與引用對(duì)象的內(nèi)容無關(guān)。

Java沒有對(duì)象不變性的概念。這是通過精心設(shè)計(jì)對(duì)象來實(shí)現(xiàn)的,這是一項(xiàng)艱巨的工作。

這是一個(gè)最喜歡的面試問題。帶著這些問題,訪問者試圖找出你對(duì)對(duì)象的構(gòu)造,方法,類變量(靜態(tài)變量)和實(shí)例變量的理解程度。

import java.util.ArrayList;import java.util.List;class Test { private final List foo; public test() {foo = new ArrayList();foo.add('foo'); // Modification-1 } public void setFoo(List foo) { //this.foo = foo; Results in compile time error. }}

在上述情況下,我們?yōu)椤?Test”定義了一個(gè)構(gòu)造函數(shù),并為其指定了“ setFoo”方法。

關(guān)于構(gòu)造器: 構(gòu)造函數(shù)可以調(diào)用只有一個(gè)使用每個(gè)對(duì)象的創(chuàng)建時(shí)間new關(guān)鍵字。你不能多次調(diào)用構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)的目的不是這樣做的。

關(guān)于方法:可以根據(jù)需要多次調(diào)用方法(甚至永遠(yuǎn)不會(huì)調(diào)用),并且編譯器知道該方法。

場(chǎng)景1

private final List foo; // 1

foo是實(shí)例變量。當(dāng)我們創(chuàng)建Test類對(duì)象時(shí),實(shí)例變量foo將被復(fù)制到Test類對(duì)象中。如果我們foo在構(gòu)造函數(shù)內(nèi)部分配,則編譯器知道構(gòu)造函數(shù)將僅被調(diào)用一次,因此在構(gòu)造函數(shù)內(nèi)部分配它沒有問題。

如果我們foo在一個(gè)方法內(nèi)部賦值,編譯器就會(huì)知道一個(gè)方法可以被多次調(diào)用,這意味著必須多次更改該值,而final變量是不允許的。因此編譯器認(rèn)為構(gòu)造函數(shù)是一個(gè)不錯(cuò)的選擇!你只能一次將值分配給最終變量。

方案2

private static final List foo = new ArrayList();

foo現(xiàn)在是一個(gè)靜態(tài)變量。當(dāng)我們創(chuàng)建Test類的實(shí)例時(shí),foo不會(huì)被復(fù)制到對(duì)象,因?yàn)樗黤oo是靜態(tài)的。現(xiàn)在foo不是每個(gè)對(duì)象的獨(dú)立屬性。這是Test類的屬性。但是foo可以被多個(gè)對(duì)象看到,如果每個(gè)使用new關(guān)鍵字創(chuàng)建的對(duì)象最終將調(diào)用Test構(gòu)造函數(shù),則該構(gòu)造函數(shù)會(huì)在創(chuàng)建多個(gè)對(duì)象時(shí)更改值(記住static foo并不是在每個(gè)對(duì)象中都復(fù)制,而是在多個(gè)對(duì)象之間共享)

場(chǎng)景3

t.foo.add('bar'); // Modification-2

以上Modification-2是你的問題。在上述情況下,你沒有更改第一個(gè)引用的對(duì)象,而是在foo其中添加了允許的內(nèi)容。如果你嘗試將a分配new ArrayList()給foo引用變量,則編譯器會(huì)抱怨。規(guī)則如果已初始化final變量,則無法將其更改為引用其他對(duì)象。(在這種情況下ArrayList)

final類不能被子類化final方法不能被覆蓋。(此方法在超類中)最終方法可以重寫。(以語法方式閱讀。此方法在子類中)

解決方法

在Java中,我們使用final帶有變量的關(guān)鍵字來指定其值不被更改。但是我看到你可以在類的構(gòu)造函數(shù)/方法中更改值。同樣,如果變量是static,則為編譯錯(cuò)誤。

這是代碼:

import java.util.ArrayList;import java.util.List;class Test { private final List foo; public Test() { foo = new ArrayList(); foo.add("foo"); // Modification-1 } public static void main(String[] args) { Test t = new Test(); t.foo.add("bar"); // Modification-2 System.out.println("print - " + t.foo); }}

上面的代碼工作正常,沒有錯(cuò)誤。

現(xiàn)在將變量更改為static:

private static final List foo;

現(xiàn)在是編譯錯(cuò)誤。這final真的如何運(yùn)作?

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 国产在线一区观看 | 久久国产精品久久国产精品 | 色视频在线观看免费 | 狠狠色综合久久丁香婷婷 | 久久久久久一品道精品免费看 | 香蕉视频亚洲一级 | 国产亚洲人成网站观看 | 国产九九在线观看播放 | 久久亚洲私人国产精品va | 欧美视频免费一区二区三区 | 亚洲品质自拍视频网站 | 美女张开双腿让男人桶视频免费 | 91精品综合久久久久m3u8 | a级毛片免费 | 国产成人小视频 | 一级中国乱子伦视频 | 在线观看日本www | 老外一级毛片免费看 | 欧美成在线视频 | 1024香蕉视频在线播放 | 亚洲欧美卡通动漫丝袜美腿 | 精品成人免费一区二区在线播放 | 国产成人a毛片 | 精品亚洲欧美高清不卡高清 | 精品一区二区久久久久久久网站 | 手机精品在线 | 久草在线免费看 | 久久国内精品自在自线观看 | 亚洲成人一级片 | 中文字幕亚洲另类天堂 | 久久久久久久国产精品 | 亚洲天码中文字幕第一页 | 久久精品操 | 手机在线播放视频 | 未成人做爰视频www 窝窝午夜精品一区二区 | 欧美特黄三级成人 | 国产高清一级毛片在线不卡 | 亚洲一区二区精品 | 盗摄偷拍a在线观看 | 特级毛片aaaa免费观看 | 另类自拍 |