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

问题描述:

任何人都可以通过示例给出可变对象和不可变对象之间的差异。可变对象和不可变对象之间的区别

+3

`String`类是不可变的对象的一个​​很好的例子。 – Qwerky 2011-01-11 14:10:44

+0

另请参见[可变与不可变对象](http://*.com/questions/214714/mutable-vs-immutable-objects)(不是Java特定的) – 2011-01-11 14:15:01

+0

btw,看看[`com.jcabi.aspects .Immutable`](http://www.jcabi.com/jcabi-aspects/annotation-immutable.html)注释 – yegor256 2013-02-18 07:06:00

可变对象的构造后可以更改它们的字段。不可变对象不能。

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; 
} 

} 
+2

+1,因为您在@Ralph之前回答,更明确地说 – KNU 2014-10-02 16:44:54

Immutable对象的状态不能改变。

例如String

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

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

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

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 
} 

他们不是但从JVM的不同点。不可变对象没有可以更改实例变量的方法。而实例变量是私有的;因此创建后无法对其进行更改。一个着名的例子是String。你没有像setString或setCharAt这样的方法。并且s1 = s1 +“w”将创建一个新的字符串,并放弃原来的字符串。 这是我的理解。

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

例如:(点是可变的和不可变的字符串)

 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