java中不变性的概念说,该类需要被标记为final才能使其成为不可变的。 我的问题是,如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它将是可变的而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为私有。
第二个问题是不可变类和不可变对象在java中有两个不同的概念?
答案 0 :(得分:2)
如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它是可变的而不是基类。基类的状态/属性将保持不可变,因为我们将基类的属性标记为私有。
假设我们的课程C1
只有final
个字段,但本身并未声明为final
。
当某人创建一个类C2
作为C1
的子类时,他们可以在C2
中包含可变字段。由于C2
的实例也是C1
的实例,我们现在可能会更改C1
的某些实例。因此,我们不能将C1
视为不可变类。
java中的不可变类和不可变对象是两个不同的概念吗?
是的。的种类。这取决于你与谁交谈:
有些人会争辩说,不可变对象是任何不可变类的实例。
其他人会争辩说,不可变对象是构造后无法更改的任何对象。例如here。并且(通过一些延伸)将包括由于API(即方法)语义的原因而不能纯粹改变的对象。
我会避免使用术语“不可变对象”而不澄清这两个定义中的哪一个适用。
为了说明歧义,使用new C1()
创建的实例可以被视为不可变对象(因为它不能被更改)或不被视为(因为它不是不可变类的实例)。