8.5.2 封闭类和Final方法
如前所述,Java 采用非常动态的方法,默认情况下采用延迟绑定(或虚函数)。因此,Java 语言引入了一些概念,如不能继承的类(封闭类)和不能在派生类中覆盖的方法(final方法或非虚拟方法)。
封闭类是指不能进一步继承的类。如果您要发布组件(不含源代码)或运行时包,并希望限制其他开发人员修改您代码的能力,这样做可能会有意义。最初的目标之一也是为了提高运行时的安全性,这在完全编译的语言(如 Object Pascal)中一般是不需要的。
final方法是虚方法,您在继承类中无法进一步覆盖。同样,虽然它们在 Java 中是有意义的(在 Java 中,所有方法默认都是虚方法,而final方法得到了显著优化),但在 C# 中却被采用了,因为在 C# 中,虚函数是显式标记的,其重要性要低得多。同样,它们也被添加到 Object Pascal 中,但在该语言中很少使用。
就语法而言,这是一个封闭类的代码:
type
TDeriv1 = class sealed(TBase)
procedure A; override;
end;
尝试从中继承会导致错误,“无法扩展封闭类TDeriv1(Cannot extend sealed class TDeriv1)”。这是最终方法的代码:
type
TDeriv2 = class(TBase)
procedure A; override; final;
end;
从这个类继承并覆盖A方法会导致编译器错误,“无法覆盖最终方法(Cannot override a final method)”。