原始的重新初始化不允许但是对象允许创建多个时间

时间:2013-06-01 18:06:36

标签: java

我有点怀疑什么时候宣布班级为最终。当我谷歌搜索它然后我知道它将有助于完全的安全性原因与字符串不可变在SO POST [1]的帮助下。

据我所知,最终变量初始化一次。只是例子:

final int i = 10;

I = 11; //给出编译时错误

,因为The final local variable i cannot be assigned. It must be blank and not using a compound assignment

但是当我多次创建最终的类变量时。它允许我这样做。如果它允许我创建一个以上的最终类实例,那么我怎么能说它是最终的?

你可以通过它满足一些业务逻辑需求给出一些最终类的例子吗?

如果我没有错,那么原始的重新初始化不允许但是对象允许创建多个时间。

3 个答案:

答案 0 :(得分:3)

使课程最终成功只会阻止人们扩展课程。您仍然可以根据需要创建任意数量的实例 例如,当你想确保一个类是不可变的时,这很有用,比如String。如果你可以扩展String,你可以添加改变String的行为,从而破坏不变性 对于类实例变量,规则与基元相同,如果它们被声明为final,则无法重新分配。但是,您仍然可以更改实例的成员。

答案 1 :(得分:1)

final表示该类无法扩展。您仍然可以创建该类的多个实例。例如:

class ImmutableInt {
  int value;
  public ImmutableInt( int val ) {
    this.value = val;
  }
  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}

在上面的例子中,我可以创建许多ImmutableInt实例。

ImmutableInt int1 = new ImmutableInt( 10 );
ImmutableInt int2 = new ImmutableInt( 100 );

这两个实例将始终设置为10和100的值。

现在让我们说有人决定他们希望能够更改ImmutableInt的值,所以他们extend ImmutableInt并提供一个setter。嗯,这对于应该是immutable

的东西来说真的没有意义

所以,我在课堂上加final说:“没有人可以扩展这个课程来破坏我的不变性合同。”我还将final添加到字段中,以便它只能在构造函数中初始化,之后不会更改。

final class ImmutableInt {
  final int value; // no default value here means it must be set in the constructor

  public ImmutableInt( int val ) {
    this.value = val;
  }

  public int getValue() {
    return value;
  }
  // no setter because I don't want people to change it!
}

答案 2 :(得分:0)

final在不同的地方使用时有不同的含义,所以不要混淆这里提到的概念:

最终课程

  

最后一堂课不能被分类。这样做的原因是   安全和效率。因此,许多Java标准   库类是final,例如java.lang.System和   java.lang.String中。

最终变量

  

最终变量只能通过一次初始化一次   初始化程序或赋值语句。它不需要   在声明点初始化:这称为"空白   最终"变量。类的空白最终实例变量必须是   肯定在类的每个构造函数的末尾分配   它被宣布;类似地,空白的最终静态变量必须是   肯定在它所在的类的静态初始化程序中分配   被宣布;否则,两种情况都会发生编译时错误。