-1

我有些怀疑何时将类声明为最终类。当我在谷歌上搜索它时,我知道它会因为安全原因而有所帮助,就像在 SO POST [1]的帮助下不可变的字符串一样。

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

最终诠释 i=10;

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

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

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

你能举一些最终类的例子,通过它满足一些业务逻辑需求吗?

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

4

3 回答 3

3

将类设为 final 只会阻止人们扩展它。您仍然可以根据需要创建任意数量的实例。
例如,当您想确保一个类是不可变的时,这很有用,就像 String 一样。如果您可以扩展 String,您可以添加改变 String 的行为,从而打破不变性。
对于类实例变量,规则与原语相同,如果它们被声明为 final,则不能重新分配。但是,您仍然可以更改实例的成员。

于 2013-06-01T18:08:38.227 回答
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!
}
于 2013-06-01T18:14:01.900 回答
0

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

期末班

最终类不能被子类化。这样做是出于安全和效率的原因。因此,许多 Java 标准库类都是最终类,例如 java.lang.System 和 java.lang.String。

最终变量

最终变量只能通过初始化程序或赋值语句初始化一次。它不需要在声明时初始化:这称为“空白最终”变量。必须在声明它的类的每个构造函数的末尾明确分配一个类的空白最终实例变量;同样,一个空白的 final 静态变量必须在声明它的类的静态初始化器中明确分配;否则,在这两种情况下都会发生编译时错误。

于 2013-06-01T18:17:14.893 回答