Java 是否需要将类标记为final以使其不可变?

Java 是否需要将类标记为final以使其不可变?,java,Java,java中的不变性概念说,类需要标记为final,以使其不可变。 我的问题是,如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它是可变的,而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为private 第二个问题是不可变类和不可变对象在java中是两个不同的概念吗 如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,子类是可变的,而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为private 假设我们有一

java中的不变性概念说,类需要标记为final,以使其不可变。 我的问题是,如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它是可变的,而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为private

第二个问题是不可变类和不可变对象在java中是两个不同的概念吗

如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,子类是可变的,而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为private

假设我们有一个类
C1
,它只有
final
字段,但本身并没有声明为
final

当某人创建一个类
C2
作为
C1
的子类时,他们可以在
C2
中包含可变字段。由于
C2
的实例也是
C1
的实例,我们现在的情况是
C1
的一些实例可能会改变。因此,我们不能认为<代码> C1<代码>是不可变的类。< /P> 不可变类和不可变对象在java中是两个不同的概念吗

嗯。有点这取决于你和谁交谈:

  • 有些人会争辩说,不可变对象是任何作为不可变类实例的对象

  • 其他人可能会争辩说,不可变对象是任何在构造后不能更改的对象。例如这将(通过某种延伸)包括纯粹因为API(即方法)语义而不能更改的对象

我会避免使用“不可变对象”一词,而不澄清这两个定义中的哪一个适用


为了说明这种模糊性,可以将使用
new C1()
创建的实例视为不可变对象(因为它无法更改)或不可变对象(因为它不是不可变类的实例)。

考虑当子类重写基类的访问器方法时会发生什么。虽然基本字段仍然是不变的,但每个观察者都会看到状态的变化。java中的不变性概念说,类需要标记为final,以使其不可变。我的问题是,如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它是可变的,而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为private”。有人能回答这个问题吗?1)从技术上讲,这是一个陈述,而不是一个问题。2)我确实解决了这个问题。关于我的回答,你不明白什么?