可变对象和不可变对象之间的区别

任何人都请举例说明可变对象和不可变对象之间的差异。

可变对象具有可以更改的字段,不可变对象在创build对象后没有可以更改的字段。

一个非常简单的不可变对象是一个没有任何字段的对象。 (例如一个简单的比较器实现)。

 class Mutable{ private int value; public Mutable(int value) { this.value = value; } getter and setter for value } class Immutable { private final int value; public Immutable(int value) { this.value = value; } only getter } 

可变对象可以在构build后更改其字段。 不可变对象不能。

 public class MutableClass { private int value; public MutableClass(int aValue) { value = aValue; } public void setValue(int aValue) { value = aValue; } public getValue() { return value; } } public class ImmutableClass { private final int value; // changed the constructor to say Immutable instead of mutable public ImmutableClass (final int aValue) { //The value is set. Now, and forever. value = aValue; } public final getValue() { return value; } } 

不可变对象只是对象的状态(对象的数据)在构造后不能改变的对象。 来自JDK的不可变对象的示例包括String和Integer。

例如:(点是可变的,string不可变)

  Point myPoint = new Point( 0, 0 ); System.out.println( myPoint ); myPoint.setLocation( 1.0, 0.0 ); System.out.println( myPoint ); String myString = new String( "old String" ); System.out.println( myString ); myString.replaceAll( "old", "new" ); System.out.println( myString ); 

输出是:

 java.awt.Point[0.0, 0.0] java.awt.Point[1.0, 0.0] old String old String 

不可变对象的状态不能改变。

例如String

 String str= "abc";//a object of string is created str = str + "def";// a new object of string is created and assigned to str 

它们与JVM的观点没有什么不同。 不可变的对象没有可以改变实例variables的方法。 而实例variables是私有的; 因此创build后无法更改。 一个着名的例子是String。 你没有像setString或setCharAt这样的方法。 而s1 = s1 +“w”将会创build一个新的string,并放弃原来的string。 这是我的理解。