可變物件和不可變物件

2021-08-28 05:31:19 字數 1283 閱讀 2473

要理解可變物件和不可變物件,先要理解final關鍵字。參考此部落格:沒有經過原博主的同意便引用了一些,侵刪!

final關鍵字可以用來修飾類、方法變數(成員或區域性)。

final修飾類時表明這個類不能被繼承。final類中的方法會被隱式的定義為fianl,變數自行定義需要不要被final修飾。

final修飾方式時,會將此方法鎖定,以防止類的繼承類修改此方法。

final修飾變數時,如果是基本資料型別變數,則變數初始化後不能再進行更改;如果是引用型別變數,(final object  obj = 乙個物件;obj = 另乙個物件;此時會編譯報錯!因為第二句話嘗試更改obj的引用值)

那麼final變數和普通變數到底有何區別呢?

public class test 

}

true

false

為什麼第乙個比較結果為true,而第二個比較結果為fasle。這裡面就是final變數和普通變數的區別了,當final變數是基本資料型別以及string型別時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變數的地方,相當於直接訪問的這個常量,不需要在執行時確定。因此在上面的一段**中,由於變數b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變數b替換為它的值。而對於變數d的訪問卻需要在執行時通過鏈結來進行。

只有在編譯期間能確切知道final變數值的情況下,編譯器才會進行這樣的優化,比如下面的這段**就不會進行優化:

public class test 

public static string gethello()

}

false
下邊回到我們最初的問題,什麼是可變物件?什麼是不可變物件?

不可變物件就是一旦別建立,其物件的資料,即物件的屬性就不能再發生改變,就好像這個物件的熟悉被final**修飾一樣。擴充套件一下,不可變物件其類就是不可變類。我們在想想,既然這物件的屬性值不會在變化,那是不是意味著這個物件是執行緒安全的呢?那必然是咯。

那麼我就要問了,我們經常new的物件都是可變物件,那如何建立乙個不可變物件呢?**如下:

public final class finalclasstoobject 

public string getvalue()

}

可變物件和不可變物件

python 在堆 heap 中分配的物件分為兩類,可變物件和不可變物件 物件的內容發生變化時,變數的物件引用是不會變化的 dict print s d dict,id dict dict a4 4 print s d dict,id dict output 42838752 42838752 不可...

可變物件,不可變物件

不可變物件為字串,元組等 可變物件為列表,字典,集合等。淺拷貝只是對已經存在的記憶體新增加乙個物件引用。深拷貝就是重新申請乙個新的記憶體,使這個是新物件是新記憶體位址的引用。對於可變物件引用時時經常出現。考慮以下兩段 1 l for i in range 10 num i print l 結果 2 ...

python 可變物件和不可變物件

變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。當將乙個變數a賦值給另乙個變數b時,無論變數a指向的是可變物件還是不可變物件,變數b指向變數a指向的物件。例 alist 1 2,3 anolist alist id alist id anolist true b...