java中的immutable和final有什么区别?

nan*_*eck 28 java

我最近被问到这个问题.但是无法简明扼要地解释这两个概念的确切区别.

例如

最终和永恒:

final String name = "John";
Run Code Online (Sandbox Code Playgroud)

如果我现在写

name = "Sam";
Run Code Online (Sandbox Code Playgroud)

我会得到一个编译器错误

一成不变的:

String name = "John";
name = "Sam"; 
Run Code Online (Sandbox Code Playgroud)

有用.

我认为这解释了它在应用中的一部分.但是,我能否就这两个主题得到一个好的,易于理解的解释?

Moh*_*uag 47

final意味着您不能将对象的引用更改为指向另一个引用或另一个对象,但您仍然可以改变其状态(例如使用setter方法).其中immutable意味着对象的实际值无法更改,但您可以将其引用更改为另一个.

关于问题的第二部分(不变部分),编译器创建一个String值为"Sam" 的新对象,并指向name它的引用.


Viv*_*ngh 15

final确保对象的地址保持不变.当作为Immutable表明,我们不能改变的对象一旦创建的状态.

final只是一个关键字,Immutable而是一个模式.

如果您的第一个问题是您将变量标记为final,这意味着您将无法更改其内存地址,并且无法再次分配值.

如果您的第二个问题Immutable确保您无法更改您创建的对象的状态.


Ank*_*hal 6

当您将字段声明为 时final引用将不会更改。它将始终指向同一个对象。

如果该对象不是immutable,则其上的方法可用于更改该对象本身 -它是同一个对象,但其属性已更改


Dam*_*oda 6

不可变: http://www.programcreek.com/2009/02/diagram-to-show-java-strings-immutability/

当您更改字符串时,创建新的字符串对象('abcdef')并将引用从'abce'更改为'abcdef'。但是您不能删除'abcd'。仅更改参考。那是一成不变的。

最终的:

实际上final是一个关键字。当你将它添加到变量中时,你不能改变引用。