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

Java 可变对象和不可变对象之间的区别,java,terminology,Java,Terminology,任何人都可以举例说明可变对象和不可变对象之间的区别。可变对象可以在构造后更改其字段。不可变的对象不能 public class MutableClass { private int value; public MutableClass(int aValue) { value = aValue; } public void setValue(int aValue) { value = aValue; } public getValue() { return valu

任何人都可以举例说明可变对象和不可变对象之间的区别。

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

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

}
无法更改对象的状态

例如
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的角度来看,它们没有什么不同。不可变对象没有可以更改实例变量的方法。实例变量是私有的;因此,您无法在创建后更改它。一个著名的例子是字符串。您没有像setString或setCharAt这样的方法。s1=s1+“w”将创建一个新字符串,而放弃原来的字符串。
这就是我的理解。

不可变对象只是其状态(对象的数据)在构造后无法更改的对象。JDK中的不可变对象示例包括字符串和整数

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

输出为:

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

String
类是不可变对象的一个很好的例子。。。所有实例变量都是私有的!(否则->可变)@Andreas\u D-谢谢你的提醒。我想我认为这是理所当然的。我投票赞成“从JVM的角度来看,它们没有什么不同”好的、高效的Java。。。谢谢你。全部替换(“旧的”、“新的”);--此代码必须类似于myString=myString.replaceAll(“旧”、“新”);--“我认为你们用错了。”图格鲁拉西克马的朋友,他用的方法是正确的。replace/replaceAll方法将返回该值。如果你想让那个存储成为一个字符串并使用它。你可以存储到同一个字符串,也可以创建一个新的字符串对象并使用它。它没有做任何操作,或者创建了一个值为“new string”的新字符串,但是由于我们没有存储它,所以它丢失了。发生了什么事?+1就像你在@Ralph之前更明确地回答的那样
     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