3

在链表实现final中被用在很多地方。例如

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

为什么final在上述实现中需要?创建一个新的引用 ( l) 以便last可以修改和覆盖。

4

3 回答 3

4

final这里并不真正需要局部变量。它只是向未来的开发人员表明,该变量不会在方法中进一步修改。当然,在上述方法中,我们不希望引用的值lnewNode方法中的任何位置发生变化。在那里,如果您(或您的队友之一)不小心做了一项这样的更改final,编译器会给您错误。

此外,这也可能使编译器对自己的部分进行一些小的优化,例如创建一个引用编译时间常量的原始类型final,这将使​​编译器在方法中使用它们的任何地方内联这些变量。请注意,final修饰符不会进入字节码,因此运行时性能绝对不受影响。如上所述,它只是为了显示开发人员的意图而存在的,仅此而已。

于 2013-10-23T06:23:11.320 回答
1

由于我们在变量“l”中的方法中存储了实例变量“last”的副本,因此“l”将指向“last”指向的对象。我们需要确保在方法执行过程中不会丢失指向该对象的指针。因此它是 final 的,它表示它只会指向“last”所指的对象

于 2013-10-23T06:20:13.163 回答
0

一旦设置了最终对象引用的标识,它仍然可以更改其状态,但不能更改其标识(也就是说,您不能将对象引用重新指向其他对象)。

在上面的代码片段中,我们无论如何都不希望引用 l 指向其他对象。因此,我们有 final 修饰符。这个参考非常重要,因为我们也需要知道链接新元素的元素。我们不能冒险失去这个参考,因此它被标记为最终的。

于 2013-10-23T06:23:05.257 回答